diff --git a/.env.example b/.env.example index 21a60e60d1f..95285979747 100644 --- a/.env.example +++ b/.env.example @@ -44,6 +44,9 @@ PORT=3000 FE_HOST=localhost FE_PORT=4200 +# Default TLD for docker dev stack (e.g. when set to "local", services will be openproject.local, nextcloud.local, etc.) +OPENPROJECT_DOCKER_DEV_TLD=local + # Use this variables to configure hostnames for frontend and backend, e.g. to enable HTTPS in docker development setup OPENPROJECT_DEV_HOST=localhost OPENPROJECT_DEV_URL=http://${OPENPROJECT_DEV_HOST}:${FE_PORT} diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 2b5b70d9550..635cea0145b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,336 +1,91 @@ # OpenProject Coding Agent Instructions -## Repository Overview +See [AGENTS.md](../AGENTS.md) for all agent instructions. -**OpenProject** is a web-based, open-source project management software written in Ruby on Rails. It uses PostgreSQL for data persistence and supports features like project planning, task management, Agile/Scrum, time tracking, wikis, and forums. +## Additional Context for GitHub Copilot -- **Size**: Large monorepo (~840MB, ~1M+ lines of code) -- **History**: Originally forked from Redmine over a decade ago, evolved significantly as an independent project -- **Backend**: Ruby 3.4.5, Rails ~8.0.3 -- **Frontend**: Node.js 22.21.0, npm 10.1.0+, TypeScript -- **Database**: PostgreSQL (required) -- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent. -- **Editions**: OpenProject comes in Community and Enterprise editions - - **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development) - - **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition. +### Common Issues and Workarounds -## Critical Setup Requirements - -### Ruby and Node Versions -**ALWAYS verify versions before building:** -- Ruby: `3.4.5` (see `.ruby-version`) -- Node: `^22.21.0` (see `package.json` engines) -- Bundler: Latest 2.x - -### Development Environment Options - -**Docker (Recommended for Quick Start)** -```bash -# ALWAYS run these commands in sequence: -cp .env.example .env -cp docker-compose.override.example.yml docker-compose.override.yml -docker compose run --rm backend setup -docker compose run --rm frontend npm install -docker compose up -d backend -# Access at http://localhost:3000 -``` - -**Local Development Setup** -```bash -# Install dependencies (ALWAYS run in this order): -bundle install # Install Ruby gems -cd frontend && npm ci && cd .. # Install Node packages (use 'ci' not 'install' for reproducibility) -bundle exec rake db:migrate # Setup database -bundle exec rails openproject:plugins:register_frontend assets:export_locales - -# Start services (use bin/dev for all-in-one): -bin/dev # Starts Rails, frontend dev server, and Good Job worker -# OR manually: -# Terminal 1: bundle exec rails server -# Terminal 2: npm run serve -# Terminal 3: bundle exec good_job start -``` - -**Important**: The `config/database.yml` file MUST NOT exist when using Docker. Delete or rename it if present. - -## Building and Testing - -### Linting (Run Before Committing) - -**Ruby (Rubocop)** -```bash -bundle exec rubocop # Check all files -bin/dirty-rubocop --uncommitted # Check only uncommitted changes -bin/dirty-rubocop --uncommitted --force-exclusion {files} # Check specific files -``` - -**JavaScript/TypeScript (ESLint)** -```bash -cd frontend -npx eslint src/ # Lint all frontend code -cd .. -``` - -**ERB Templates (erb_lint)** -```bash -erb_lint {files} # Lint ERB template files -``` - -**Install Git Hooks** (optional but recommended): -```bash -bundle exec lefthook install # Sets up pre-commit hooks for linting -``` - -### Running Tests - -**Backend Tests (RSpec)** -```bash -# Run specific tests (ALWAYS preferred over running all tests): -bundle exec rspec spec/models/user_spec.rb # Single file -bundle exec rspec spec/models/user_spec.rb:42 # Single line -bundle exec rspec spec/features # Directory - -# Run all tests (slow, ~40 minutes on CI): -bundle exec rspec - -# Parallel execution (faster): -bundle exec rake parallel:spec - -# With Docker: -docker compose run --rm backend-test "bundle exec rspec spec/features/work_package_show_spec.rb" -``` - -**Frontend Tests (Jasmine/Karma)** -```bash -cd frontend -npm test # Run all frontend unit tests -npm run test:ci # Run in CI mode (single run) -cd .. -``` - -**Debugging Failed GitHub Actions Tests** -```bash -# Extract and run all failed tests from CI: -./script/github_pr_errors -./script/github_pr_errors | xargs bundle exec rspec - -# Run flaky tests multiple times: -./script/bulk_run_rspec spec/path/to/flaky_spec.rb -``` - -### Running the Application Locally - -**Development Mode** -```bash -bin/dev # Uses Overmind or Foreman to start all services -# Access at http://localhost:3000 -``` - -**Individual Services** -```bash -bundle exec rails server # Rails backend (port 3000) -npm run serve # Frontend dev server (proxied through Rails) -bundle exec good_job start # Background job worker -``` - -## Project Structure - -### Key Directories -- `app/` - Rails application code (models, controllers, services, views, components) - - `app/components/` - ViewComponent-based UI components (Ruby + ERB) - - `app/contracts/` - Validation and authorization contracts - - `app/controllers/` - Rails controllers - - `app/models/` - ActiveRecord models - - `app/services/` - Service objects (business logic) - - `app/workers/` - Background job workers -- `config/` - Rails configuration - - `config/application.rb` - Application configuration - - `config/locales/` - I18n translations - - `config/routes.rb` - Rails routes -- `db/` - Database migrations and seeds -- `docker/` - Docker build contexts -- `frontend/src/` - Frontend - - `frontend/src/app/` - Angular modules, components, services (legacy Angular code) - - `frontend/src/main.ts` - Angular Application bootstrap entry point - - `frontend/src/react` - React components (currently only used for experimental BlockNote integration) - - `frontend/src/stimulus` - Stimulus controllers, helpers - - `frontend/src/turbo` - Turbo integration (e.g. custom Turbo Stream actions) -- `lib/` - Ruby libraries and extensions -- `lookbook/` - Lookbook component previews for ViewComponents (see https://github.com/lookbook-hq/lookbook) -- `modules/` - OpenProject plugin modules -- `spec/` - RSpec test suite - - `spec/features/` - System/feature tests (Capybara) - - `spec/models/` - Model unit tests - - `spec/requests/` - API/integration tests - - `spec/services/` - Service tests - -### Configuration Files -- `.erb_lint.yml` - ERB template linting -- `.rubocop.yml` - Ruby linting rules -- `.ruby-version` - Ruby version (check this file for current version) -- `docker-compose.yml` - Docker development environment -- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting -- `Gemfile` / `Gemfile.lock` - Ruby dependencies -- `lefthook.yml` - Git hooks configuration -- `package.json` / `frontend/package.json` - Node.js dependencies -- `Procfile.dev` - Services for `bin/dev` - -## GitHub Actions CI/CD - -### Main Workflows -- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs) -- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes) -- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes) -- **test-frontend-unit.yml** - Frontend unit tests -- **brakeman-scan-core.yml** - Security scanning -- **codeql-scan-core.yml** - Code quality/security analysis - -### CI Requirements for Merge -- All linting checks must pass (Rubocop, ESLint, erb_lint) -- Test suite must be green -- No security vulnerabilities introduced (Brakeman, CodeQL) - -**Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly). - -## Common Issues and Workarounds - -### Database Configuration +#### Database Configuration - **Issue**: Docker fails with "database.yml exists" - **Fix**: Delete or rename `config/database.yml` when using Docker -### Memory Issues in Docker +#### Memory Issues in Docker - **Issue**: Frontend container exits with status 137 - **Fix**: Increase Docker memory limit to at least 4GB -### Test Failures on CI but Passing Locally +#### Test Failures on CI but Passing Locally - Run with `CI=true` environment variable (eager loads app) - Check for `OPENPROJECT_*` environment variables - Match the random seed: `bundle exec rspec --seed 18352` - Use `--bisect` to find order-dependent failures - View browser tests with `OPENPROJECT_TESTING_NO_HEADLESS=1` -### Frontend Build Issues +#### Frontend Build Issues - **Issue**: "jQuery not defined", frontend asset errors, or blank page - **Fix**: Run `bin/setup_dev` to rebuild frontend completely -### Parallel Test Failures +#### Parallel Test Failures - Tests run in parallel on CI with different random seeds per group - Check `tmp/parallel_runtime.log` for execution times - **Flaky specs**: Some tests may fail randomly; see `docs/development/running-tests/` for handling flaky tests - Use `script/bulk_run_rspec` to run tests multiple times to identify flaky behavior -## Code Style Guidelines +### Extended Details -### Ruby -- Follow [Ruby community style guide](https://github.com/bbatsov/ruby-style-guide) -- Use service objects for complex business logic - - Return results using the `ServiceResult` class (well-documented in codebase) - - Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling -- Use contracts for validation and authorization -- Keep controllers thin, models focused -- Document code units and patterns with [YARD](https://yardoc.org/) -- Write tests for all new features (RSpec) - - Unit tests for models, services, and other components - - Feature specs use Capybara (with Cuprite and Selenium WebDriver) - - Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`) +#### Service Objects and Result Modeling +- Return results using the `ServiceResult` class (well-documented in codebase) +- Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling -### Database Migrations -- Follow Rails migration conventions +#### Testing with Capybara +- Feature specs use Capybara (with Cuprite and Selenium WebDriver) +- Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`) + +#### Database Migrations - OpenProject implements migration "squashing" between major releases - See `docs/development/migrations/` for details on the squashing process - Migrations are consolidated to manage database changes across major versions - OpenProject does not currently aim for zero downtime migrations -### JavaScript/TypeScript -- **New development**: Use Hotwire (Turbo + Stimulus) with server-rendered HTML -- **Legacy code**: Follow ESLint recommended rules (eslint, typescript-eslint, Angular ESLint) -- Prefer TypeScript over JavaScript -- **Design system**: Use GitHub's [Primer Design System](https://primer.style/product/) via ViewComponent - - [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent - - [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons - - [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support -- Write unit tests for components (Jasmine for legacy Angular, RSpec for ViewComponents) +#### Design System Components +- [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent +- [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons +- [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support -### Templates -- Use ERB for server-rendered views -- Use ViewComponents for reusable UI components - - Document new ViewComponents with API/Yard docs and Lookbook previews - - Lookbook deployed at: https://qa.openproject-edge.com/lookbook/ - - See https://github.com/lookbook-hq/lookbook for Lookbook documentation -- Lint with erb_lint before committing +#### Enterprise and BIM Editions +- **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development) +- **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition. -### Commit Messages -- First line: < 72 characters -- Blank line -- Detailed description wrapped to 72 characters -- Reference work packages when applicable -- See [code review guidelines](docs/development/code-review-guidelines/) for more details -- **Merge strategy**: Use "Merge pull request" (not squash) to retain commit history, except for single-commit PRs which can use "Rebase and merge" +#### GitHub Actions CI/CD +- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs) +- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes) +- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes) +- **test-frontend-unit.yml** - Frontend unit tests +- **brakeman-scan-core.yml** - Security scanning +- **codeql-scan-core.yml** - Code quality/security analysis +- **Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly) -### Translations -- OpenProject is a multilingual product with officially supported and community-supported languages -- UI translations are managed via [Crowdin](https://crowdin.com/) -- Don't modify translation files directly; contributions should go through Crowdin - - Exception: Source translations in `**/config/locales/en.yml` can be modified directly -- UI strings should never be hard-coded; always use translation keys for accessibility and internationalization - -## Performance Considerations - -### CI Timeouts +#### Performance Considerations - Main test suite: 40 minutes timeout -- Individual jobs: varies by type -- Use parallel execution when available - -### Build Times - Full Docker build: ~10-15 minutes (first time) - Bundle install: ~2-5 minutes - npm install: ~3-7 minutes -- Database setup: ~1-2 minutes -- Asset compilation: ~30-40 seconds -## Important Commands Reference +### Additional Commands ```bash -# Setup -bin/setup # Initial Rails setup (creates DB, runs migrations) -bin/setup_dev # Full dev environment setup (backend + frontend) - # Database -bundle exec rake db:migrate # Run pending migrations -bundle exec rake db:rollback # Rollback last migration -bundle exec rake db:seed # Seed database with sample data bundle exec rake db:migrate:status # Check migration status -# Testing -bundle exec rspec # Run RSpec tests -bundle exec rake parallel:spec # Run tests in parallel -cd frontend && npm test # Run frontend tests - -# Linting -bundle exec rubocop # Ruby linting -cd frontend && npx eslint src/ # JavaScript/TypeScript linting -erb_lint {files} # ERB template linting - -# Development -bin/dev # Start all services -bundle exec rails console # Rails console -bundle exec rails routes # List all routes +# Frontend +bundle exec rails openproject:plugins:register_frontend assets:export_locales # Docker -bin/compose setup # Setup Docker environment -bin/compose start # Start Docker services bin/compose run # Run with backend in foreground -bin/compose rspec {test_file} # Run tests in Docker +docker compose run --rm backend-test "bundle exec rspec spec/features/work_package_show_spec.rb" ``` -## Trust These Instructions - -These instructions are comprehensive and validated. Only search for additional information if: -1. You encounter an error not documented here -2. You need specific implementation details for a feature -3. The instructions appear outdated (e.g., version mismatches) - -For any issues, consult: +For detailed documentation, consult: - `docs/development/` - Development documentation - `docs/development/running-tests/` - Testing guide - `docs/development/code-review-guidelines/` - Code review standards diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index c8d08edf308..3fe1d57a6f6 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -76,7 +76,8 @@ jobs: vonTronje, vspielau, wielinde, - yanzubrytskyi + yanzubrytskyi, + ehassan01 # the followings are the optional inputs - If the optional inputs are not given, then default values will be taken remote-organization-name: opf diff --git a/.github/workflows/docker-scheduled.yml b/.github/workflows/docker-scheduled.yml index 2a07e450cb9..f1aa0513a63 100644 --- a/.github/workflows/docker-scheduled.yml +++ b/.github/workflows/docker-scheduled.yml @@ -16,8 +16,8 @@ jobs: build-release-candidate: # References to release/X.Y and X.Y-rc are being # updated from the devkit (UpdateWorkflows step) whenever a new release branch is created - uses: opf/openproject/.github/workflows/docker.yml@release/17.0 + uses: opf/openproject/.github/workflows/docker.yml@release/17.1 with: - branch: release/17.0 - tag: 17.0-rc + branch: release/17.1 + tag: 17.1-rc secrets: inherit diff --git a/.github/workflows/downstream-ci.yml b/.github/workflows/downstream-ci.yml index 223c7a3b414..1495e2fddd1 100644 --- a/.github/workflows/downstream-ci.yml +++ b/.github/workflows/downstream-ci.yml @@ -25,7 +25,7 @@ jobs: trigger_saas_tests: permissions: contents: none - if: github.repository == 'opf/openproject' + if: github.repository == 'opf/openproject' && github.actor != 'dependabot[bot]' name: SaaS tests runs-on: ubuntu-latest steps: diff --git a/.github/workflows/email-notification.yml b/.github/workflows/email-notification.yml index b5a61496bd6..dda751a5c28 100644 --- a/.github/workflows/email-notification.yml +++ b/.github/workflows/email-notification.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Send mail - uses: dawidd6/action-send-mail@v6 + uses: dawidd6/action-send-mail@v7 with: subject: ${{ inputs.subject }} body: ${{ inputs.body }} diff --git a/.github/workflows/pullpreview.yml b/.github/workflows/pullpreview.yml index 70c9318e0ef..6e909c68c1e 100644 --- a/.github/workflows/pullpreview.yml +++ b/.github/workflows/pullpreview.yml @@ -37,7 +37,6 @@ jobs: echo "OPENPROJECT_ENTERPRISE__CHARGEBEE__SITE=openproject-enterprise-test" >> .env.pullpreview echo "OPENPROJECT_ENTERPRISE__TRIAL__CREATION__HOST=https://start.openproject-edge.com" >> .env.pullpreview echo "OPENPROJECT_FEATURE_BLOCK_NOTE_EDITOR=true" >> .env.pullpreview - echo "OPENPROJECT_FEATURE_WP_ACTIVITY_TAB_LAZY_PAGINATION_ACTIVE=true" >> .env.pullpreview - name: Boot as BIM edition if: contains(github.ref, 'bim/') || contains(github.head_ref, 'bim/') run: | diff --git a/.gitignore b/.gitignore index 73497ae4f0b..419de2618d3 100644 --- a/.gitignore +++ b/.gitignore @@ -133,6 +133,10 @@ db/*.sql lefthook-local.yml .rubocop-local.yml +# Local AI coding agent instruction overrides +AGENTS.local.md +CLAUDE.local.md + /.lefthook-local/ frontend/package-lock.json diff --git a/.rubocop.yml b/.rubocop.yml index 89c49123a5b..c4067e4f6a0 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -59,6 +59,9 @@ Layout/MultilineMethodCallIndentation: Layout/MultilineOperationIndentation: Enabled: false +Lint/AmbiguousBlockAssociation: + AllowedMethods: [change] + Lint/AmbiguousOperator: Enabled: false @@ -98,14 +101,11 @@ Lint/UnderscorePrefixedVariableName: Lint/Void: Enabled: false -Lint/AmbiguousBlockAssociation: - AllowedMethods: [change] - -Metrics/ClassLength: - Enabled: false - -Metrics/CyclomaticComplexity: - Enabled: false +Metrics/AbcSize: + Enabled: true + Exclude: + - "spec/**/*.rb" + - "modules/*/spec/**/*.rb" Metrics/BlockLength: Enabled: false @@ -113,6 +113,12 @@ Metrics/BlockLength: Metrics/BlockNesting: Enabled: false +Metrics/ClassLength: + Enabled: false + +Metrics/CyclomaticComplexity: + Enabled: false + Metrics/MethodLength: Enabled: false @@ -122,12 +128,6 @@ Metrics/ModuleLength: Metrics/ParameterLists: Enabled: false -Metrics/AbcSize: - Enabled: true - Exclude: - - "spec/**/*.rb" - - "modules/*/spec/**/*.rb" - Naming/AccessorMethodName: Enabled: false @@ -150,10 +150,15 @@ Naming/VariableNumber: - '\w_20\d\d' # allow dates like christmas_2022 or date_2034_04_12 - '\w\d++(_\d++)+' # allow hierarchical data like child1_2_5 (second + in regex is possessive qualifier) - 'custom_field_\d+' # allow custom field method names to be called with send :custom_field_1001 -# There are valid cases in which to use methods like: -# * update_all -# * touch_all -Rails/SkipsModelValidations: + +OpenProject/AddPreviewForViewComponent: + Include: + - app/components/op_turbo/**.rb + - app/components/op_primer/**.rb + - app/components/open_project/**.rb + - app/components/concerns/**.rb + +Performance/Casecmp: Enabled: false # Don't force us to use tag instead of content_tag @@ -161,55 +166,6 @@ Rails/SkipsModelValidations: Rails/ContentTag: Enabled: false -# Disable I18n.locale = in specs, where it is reset -# by us explicitly -Rails/I18nLocaleAssignment: - Enabled: true - Exclude: - - "spec/**/*.rb" - -# Do not bother if `let` statements use an index in their name -RSpec/IndexedLet: - Enabled: false - -# The http verbs in Rack::Test do not accept named parameters (params: params) -Rails/HttpPositionalArguments: - Enabled: false - -# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode. -Rails/RequireDependency: - Enabled: true - -# For feature specs, we tend to have longer specs that cover a larger part of the functionality. -# This is done for multiple reasons: -# * performance, as setting up integration tests is costly -# * following a scenario that is closer to how a user interacts -RSpec/ExampleLength: - Max: 25 - Enabled: true - Exclude: - - "spec/features/**/*.rb" - - "modules/*/spec/features/**/*.rb" - -# We have specs that have no expect(..) syntax, -# but only helper classes that expect themselves -RSpec/NoExpectationExample: - Enabled: false - -RSpec/DescribeClass: - Enabled: true - Exclude: - - "spec/features/**/*.rb" - - "modules/*/spec/features/**/*.rb" - -# Nothing wrong with `include_examples` when used properly. -RSpec/IncludeExamples: - Enabled: false - -# Allow number HTTP status codes in specs -RSpecRails/HttpStatus: - Enabled: false - # dynamic finders cop clashes with capybara ID cop Rails/DynamicFindBy: Enabled: true @@ -220,6 +176,7 @@ Rails/DynamicFindBy: Whitelist: - find_by_login - find_by_mail + - find_by_plaintext_value # Allow reorder to prevent find each cop triggering Rails/FindEach: @@ -230,53 +187,38 @@ Rails/FindEach: - select - lock +# The http verbs in Rack::Test do not accept named parameters (params: params) +Rails/HttpPositionalArguments: + Enabled: false + +# Disable I18n.locale = in specs, where it is reset +# by us explicitly +Rails/I18nLocaleAssignment: + Enabled: true + Exclude: + - "spec/**/*.rb" + # We have config.active_record.belongs_to_required_by_default = false , # which means, we do have to declare presence validators on belongs_to relations. Rails/RedundantPresenceValidationOnBelongsTo: Enabled: false -# See RSpec/ExampleLength for why feature specs are excluded -RSpec/MultipleExpectations: - Max: 15 - Enabled: true - Exclude: - - "spec/features/**/*.rb" - - "modules/*/spec/features/**/*.rb" - -RSpec/MultipleMemoizedHelpers: - Enabled: false - -RSpec/NestedGroups: - Enabled: false - -# Don't force the second argument of describe -# to be .class_method or #instance_method -RSpec/DescribeMethod: - Enabled: false - -# Don't force the second argument of describe -# to match the exact file name -RSpec/SpecFilePathFormat: - CustomTransform: - OpenIDConnect: openid_connect - OAuthClients: oauth_clients - OAuth: oauth - ICal: ical - IgnoreMethods: true - -# Prevent "fit" or similar to be committed -RSpec/Focus: +# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode. +Rails/RequireDependency: Enabled: true -# We use let!() to ensure dependencies are created -# instead of let() and referencing them explicitly -RSpec/LetSetup: +# Require save! to prevent saving without validation when saving outside of a condition. +Rails/SaveBang: + Enabled: true + +# There are valid cases in which to use methods like: +# * update_all +# * touch_all +Rails/SkipsModelValidations: Enabled: false -RSpec/LeadingSubject: - Enabled: false - -RSpec/NamedSubject: +# Allow number HTTP status codes in specs +RSpecRails/HttpStatus: Enabled: false # expect not_to change is not working as expected @@ -303,6 +245,79 @@ RSpec/ContextWording: - within - without +RSpec/DescribeClass: + Enabled: true + Exclude: + - "spec/features/**/*.rb" + - "modules/*/spec/features/**/*.rb" + +# Don't force the second argument of describe +# to be .class_method or #instance_method +RSpec/DescribeMethod: + Enabled: false + +# For feature specs, we tend to have longer specs that cover a larger part of the functionality. +# This is done for multiple reasons: +# * performance, as setting up integration tests is costly +# * following a scenario that is closer to how a user interacts +RSpec/ExampleLength: + Max: 25 + Enabled: true + Exclude: + - "spec/features/**/*.rb" + - "modules/*/spec/features/**/*.rb" + +# Prevent "fit" or similar to be committed +RSpec/Focus: + Enabled: true + +# Nothing wrong with `include_examples` when used properly. +RSpec/IncludeExamples: + Enabled: false + +# Do not bother if `let` statements use an index in their name +RSpec/IndexedLet: + Enabled: false + +RSpec/LeadingSubject: + Enabled: false + +# We use let!() to ensure dependencies are created +# instead of let() and referencing them explicitly +RSpec/LetSetup: + Enabled: false + +# We have specs that have no expect(..) syntax, +# but only helper classes that expect themselves +RSpec/NoExpectationExample: + Enabled: false + +# See RSpec/ExampleLength for why feature specs are excluded +RSpec/MultipleExpectations: + Max: 15 + Enabled: true + Exclude: + - "spec/features/**/*.rb" + - "modules/*/spec/features/**/*.rb" + +RSpec/MultipleMemoizedHelpers: + Enabled: false + +RSpec/NestedGroups: + Enabled: false + +# Don't force the second argument of describe +# to match the exact file name +RSpec/SpecFilePathFormat: + CustomTransform: + OpenIDConnect: openid_connect + OAuthClients: oauth_clients + EnforcedInflector: active_support + IgnoreMethods: true + +RSpec/NamedSubject: + Enabled: false + Style/Alias: Enabled: false @@ -367,6 +382,19 @@ Style/FormatString: Style/FormatStringToken: AllowedMethods: [redirect] +Style/FrozenStringLiteralComment: + Enabled: true + EnforcedStyle: always_true + +Style/HashEachMethods: + Enabled: true + +Style/HashTransformKeys: + Enabled: true + +Style/HashTransformValues: + Enabled: true + Style/GlobalVars: Enabled: false @@ -409,6 +437,13 @@ Style/NilComparison: Style/Not: Enabled: false +Style/NumericLiterals: + Enabled: false + +# Avoid enforcing "positive?" +Style/NumericPredicate: + Enabled: false + Style/OneLineConditional: Enabled: false @@ -471,33 +506,3 @@ Style/WhileUntilModifier: Style/WordArray: Enabled: false - -Style/FrozenStringLiteralComment: - Enabled: true - EnforcedStyle: always_true - -Style/NumericLiterals: - Enabled: false - -# Avoid enforcing "positive?" -Style/NumericPredicate: - Enabled: false - -Style/HashEachMethods: - Enabled: true - -Style/HashTransformKeys: - Enabled: true - -Style/HashTransformValues: - Enabled: true - -Performance/Casecmp: - Enabled: false - -OpenProject/AddPreviewForViewComponent: - Include: - - app/components/op_turbo/**.rb - - app/components/op_primer/**.rb - - app/components/open_project/**.rb - - app/components/concerns/**.rb diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000000..6b5de352770 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,237 @@ +# OpenProject AI Coding Agent Instructions + +> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository. + +## Repository Overview + +**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence. + +- **Size**: Large monorepo (~840MB, ~1M+ lines of code) +- **Backend**: Ruby 3.4.7, Rails ~8.0.3 +- **Frontend**: Node.js 22.21.0, npm 10.1.0+, TypeScript +- **Database**: PostgreSQL (required) +- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent. +- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`) + +## Critical Setup Requirements + +**ALWAYS verify versions before building:** +- Ruby: `3.4.7` (see `.ruby-version`) +- Node: `^22.21.0` (see `package.json` engines) +- Bundler: Latest 2.x + +OpenProject supports two development setups: **Local** and **Docker**. Choose one based on your preference. + +### Local Development Setup + +```bash +bundle install # Install Ruby gems +cd frontend && npm ci && cd .. # Install Node packages +bundle exec rake db:migrate # Setup database +bin/dev # Start all services (Rails, frontend, Good Job worker) +# Access at http://localhost:3000 +``` + +### Docker Development Setup + +The Docker development environment uses configurations in `docker/dev/` and the `bin/compose` wrapper script. + +```bash +# Initial setup (first time only) +bin/compose setup # Installs backend and frontend dependencies + +# Starting services +bin/compose start # Start backend and frontend in background +bin/compose run # Start frontend in background, backend in foreground (for debugging with pry) + +# Running tests +bin/compose rspec spec/models/user_spec.rb # Run specific tests in backend-test container + +# Other operations +bin/compose reset # Remove all containers and volumes (requires setup again) +bin/compose # Pass any docker-compose command directly +``` + +**Important Docker Notes:** +- **CRITICAL**: `config/database.yml` must NOT exist when using Docker (rename or delete it) +- Most developers use a local `docker-compose.override.yml` for custom port mappings and configurations +- Copy `docker-compose.override.example.yml` to `docker-compose.override.yml` and customize as needed +- Default ports: Backend at http://localhost:3000 (or 4200 for frontend dev server) +- Services: `backend`, `frontend`, `worker`, `db`, `db-test`, `backend-test`, `cache` +- Persisted volumes: `pgdata`, `bundle`, `npm`, `tmp`, `opdata` (data survives container restarts) +- Docker build context: Uses Dockerfiles in `docker/dev/backend/` and `docker/dev/frontend/` + +## Project Structure + +### Key Directories +- `app/` - Rails application code + - `app/components/` - ViewComponent-based UI components (Ruby + ERB) + - `app/contracts/` - Validation and authorization contracts + - `app/controllers/` - Rails controllers + - `app/models/` - ActiveRecord models + - `app/services/` - Service objects (business logic) + - `app/workers/` - Background job workers +- `config/` - Rails configuration, routes, locales +- `db/` - Database migrations and seeds +- `frontend/src/` - Frontend code + - `frontend/src/app/` - Legacy Angular modules/components + - `frontend/src/stimulus/` - Stimulus controllers + - `frontend/src/turbo/` - Turbo integration +- `lib/` - Ruby libraries and extensions +- `lookbook/` - ViewComponent previews (https://qa.openproject-edge.com/lookbook/) +- `modules/` - OpenProject plugin modules +- `spec/` - RSpec test suite + - `spec/features/` - System/feature tests (Capybara) + - `spec/models/` - Model unit tests + - `spec/requests/` - API/integration tests + - `spec/services/` - Service tests + +### Configuration Files +- `.ruby-version` - Ruby version +- `.rubocop.yml` - Ruby linting rules +- `.erb_lint.yml` - ERB template linting +- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting +- `Gemfile` - Ruby dependencies +- `package.json` / `frontend/package.json` - Node.js dependencies +- `lefthook.yml` - Git hooks configuration + +## Building and Testing + +### Linting (Run Before Committing) + +```bash +# Ruby +bundle exec rubocop # Check all files +bin/dirty-rubocop --uncommitted # Check only uncommitted changes + +# JavaScript/TypeScript +cd frontend && npx eslint src/ && cd .. + +# ERB Templates +erb_lint {files} + +# Install Git Hooks (recommended) +bundle exec lefthook install +``` + +### Running Tests + +```bash +# Backend (RSpec) - prefer specific tests over running all +bundle exec rspec spec/models/user_spec.rb # Single file +bundle exec rspec spec/models/user_spec.rb:42 # Single line +bundle exec rspec spec/features # Directory +bundle exec rake parallel:spec # Parallel execution + +# Frontend (Jasmine/Karma) +cd frontend && npm test && cd .. +``` + +### Debugging CI Failures +```bash +./script/github_pr_errors | xargs bundle exec rspec # Run failed tests from CI +./script/bulk_run_rspec spec/path/to/flaky_spec.rb # Run tests multiple times +``` + +## Code Style Guidelines + +### Ruby +- Follow [Ruby community style guide](https://github.com/bbatsov/ruby-style-guide) +- Use service objects for complex business logic (return `ServiceResult`) +- Use contracts for validation and authorization +- Keep controllers thin, models focused +- Document with [YARD](https://yardoc.org/) +- Write RSpec tests for all new features + +### JavaScript/TypeScript +- **New development**: Use Hotwire (Turbo + Stimulus) with server-rendered HTML +- **Legacy code**: Follow ESLint rules +- Prefer TypeScript over JavaScript +- Use [Primer Design System](https://primer.style/product/) via ViewComponent + +### Templates +- Use ERB for server-rendered views +- Use ViewComponents for reusable UI (with Lookbook previews) +- Lint with erb_lint before committing + +### Database Migrations +- Follow Rails migration conventions +- Migrations are "squashed" between major releases (see `docs/development/migrations/`) + +### Translations +- UI strings must use translation keys (never hard-coded) +- Source translations in `**/config/locales/en.yml` can be modified directly +- Other translations managed via Crowdin + +### Commit Messages +- First line: < 72 characters, then blank line, then detailed description +- Reference work packages when applicable +- Merge strategy: "Merge pull request" (not squash), except single-commit PRs can use "Rebase and merge" + +## Important Commands Reference + +### Local Development Commands + +```bash +# Setup +bin/setup # Initial Rails setup +bin/setup_dev # Full dev environment setup + +# Database +bundle exec rake db:migrate # Run migrations +bundle exec rake db:rollback # Rollback last migration +bundle exec rake db:seed # Seed sample data + +# Development +bin/dev # Start all services +bundle exec rails console # Rails console +bundle exec rails routes # List routes + +# Testing +bundle exec rspec # Run RSpec tests +bundle exec rake parallel:spec # Parallel tests +cd frontend && npm test # Frontend tests + +# Linting +bundle exec rubocop # Ruby linting +cd frontend && npx eslint src/ # JS/TS linting +erb_lint {files} # ERB linting +``` + +### Docker Development Commands + +```bash +# Setup and lifecycle +bin/compose setup # Setup Docker environment (first time) +bin/compose start # Start all services in background +bin/compose run # Start frontend in background, backend in foreground +bin/compose reset # Remove all containers and volumes +bin/compose stop # Stop all services +bin/compose down # Stop and remove containers + +# Testing +bin/compose rspec spec/models/user_spec.rb # Run specific tests +bin/compose exec backend bundle exec rspec # Run tests directly in backend container + +# Development +bin/compose exec backend bundle exec rails console # Rails console +bin/compose logs backend # View backend logs +bin/compose logs -f backend # Follow backend logs +bin/compose ps # List running containers + +# Database +bin/compose exec backend bundle exec rake db:migrate # Run migrations +bin/compose exec backend bundle exec rake db:seed # Seed data + +# Direct docker-compose commands +bin/compose up -d # Start services +bin/compose restart backend # Restart backend service +``` + +## Additional Documentation + +- `docs/development/` - Development documentation +- `docs/development/running-tests/` - Testing guide +- `docs/development/code-review-guidelines/` - Code review standards +- `CONTRIBUTING.md` - Contribution workflow +- `.github/copilot-instructions.md` - Extended agent instructions with troubleshooting diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 00000000000..47dc3e3d863 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/Gemfile b/Gemfile index 5f841006cf5..e152dab8776 100644 --- a/Gemfile +++ b/Gemfile @@ -46,6 +46,8 @@ gem "responders", "~> 3.2" gem "ffi", "~> 1.15" +gem "connection_pool", "~> 2.5.5" + gem "rdoc", ">= 2.4.2" gem "doorkeeper", "~> 5.8.0" @@ -60,13 +62,13 @@ gem "warden-basic_auth", "~> 0.2.1" gem "pagy" gem "will_paginate", "~> 4.0.0" -gem "friendly_id", "~> 5.5.0" +gem "friendly_id", "~> 5.6.0" gem "scimitar", "~> 2.13" gem "acts_as_list", "~> 1.2.6" gem "acts_as_tree", "~> 2.9.0" -gem "awesome_nested_set", "~> 3.8.0" +gem "awesome_nested_set", "~> 3.9.0" gem "closure_tree", "~> 9.3.0" gem "rubytree", "~> 2.1.0" @@ -95,7 +97,7 @@ gem "deckar01-task_list", "~> 2.3.1" # Requires escape-utils for faster escaping gem "escape_utils", "~> 1.3" # Syntax highlighting used in html-pipeline with rouge -gem "rouge", "~> 4.6.1" +gem "rouge", "~> 4.7.0" # HTML sanitization used for html-pipeline gem "sanitize", "~> 7.0.0" # HTML autolinking for mails and urls (replaces autolink) @@ -109,7 +111,7 @@ gem "svg-graph", "~> 2.2.0" gem "date_validator", "~> 0.12.0" gem "email_validator", "~> 2.2.3" -gem "json_schemer", "~> 2.4.0" +gem "json_schemer", "~> 2.5.0" gem "ruby-duration", "~> 3.2.0" gem "mail", "2.9.0" @@ -121,7 +123,7 @@ gem "sys-filesystem", "~> 1.5.0", require: false gem "bcrypt", "~> 3.1.6" -gem "multi_json", "~> 1.17.0" +gem "multi_json", "~> 1.19.0" gem "oj", "~> 3.16.12" gem "daemons" @@ -139,7 +141,7 @@ gem "rack-attack", "~> 6.8.0" gem "browser", "~> 6.2.0" # Providing health checks -gem "okcomputer", "~> 1.19.0" +gem "okcomputer", "~> 1.19.1" # Lograge to provide sane and non-verbose logging gem "lograge", "~> 0.14.0" @@ -151,7 +153,7 @@ gem "structured_warnings", "~> 0.5.0" # don't require by default, instead load on-demand when actually configured gem "airbrake", "~> 13.0.0", require: false -gem "markly", "~> 0.14" # another Markdown parser like commonmarker, but with AST support used in PDF export +gem "markly", "~> 0.15" # another markdown parser like commonmarker, but with AST support used in PDF export gem "md_to_pdf", git: "https://github.com/opf/md-to-pdf", ref: "6c565541bfa390c58d90d49aa9b487777704fc66" gem "prawn", "~> 2.4" gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues/1346 resolved. @@ -159,6 +161,8 @@ gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues # prawn implicitly depends on matrix gem no longer in ruby core with 3.1 gem "matrix", "~> 0.4.3" +gem "mcp", "~> 0.4.0" + gem "meta-tags", "~> 2.22.2" gem "paper_trail", "~> 17.0.0" @@ -179,7 +183,7 @@ group :production do end gem "i18n-js", "~> 4.2.4" -gem "rails-i18n", "~> 8.0.0" +gem "rails-i18n", "~> 8.1.0" gem "sprockets", "~> 3.7.2" # lock sprockets below 4.0 gem "sprockets-rails", "~> 3.5.1" @@ -188,19 +192,19 @@ gem "puma", "~> 7.1" gem "puma-plugin-statsd", "~> 2.7" gem "rack-timeout", "~> 0.7.0", require: "rack/timeout/base" -gem "nokogiri", "~> 1.18.10" +gem "nokogiri", "~> 1.19.0" gem "carrierwave", "~> 1.3.4" gem "carrierwave_direct", "~> 2.1.0" gem "fog-aws" -gem "aws-sdk-core", "~> 3.239" +gem "aws-sdk-core", "~> 3.241" # File upload via fog + screenshots on travis -gem "aws-sdk-s3", "~> 1.205" +gem "aws-sdk-s3", "~> 1.211" -gem "openproject-token", "~> 8.3.0" +gem "openproject-token", "~> 8.6.0" -gem "plaintext", "~> 0.3.2" +gem "plaintext", "~> 0.3.7" gem "ruby-progressbar", "~> 1.13.0", require: false @@ -227,12 +231,12 @@ gem "yabeda-rails" # opentelemetry gem "opentelemetry-exporter-otlp", "~> 0.31.0", require: false -gem "opentelemetry-instrumentation-all", "~> 0.87.0", require: false +gem "opentelemetry-instrumentation-all", "~> 0.89.0", require: false gem "opentelemetry-sdk", "~> 1.10", require: false -gem "view_component", "~> 4.1.1" +gem "view_component", "~> 4.2.0" # Lookbook -gem "lookbook", "2.3.13" +gem "lookbook", "2.3.14" gem "inline_svg", "~> 1.10.0" @@ -358,7 +362,7 @@ group :development, :test do gem "rubocop-factory_bot", require: false gem "rubocop-openproject", require: false gem "rubocop-performance", require: false - gem "rubocop-rails", "= 2.33.3", require: false # 2.33.4 has issues with Rails/ActionControllerFlashBeforeRender + gem "rubocop-rails", "~> 2.34.2" gem "rubocop-rspec", require: false gem "rubocop-rspec_rails", require: false @@ -376,7 +380,7 @@ group :development, :test do gem "active_record_doctor", "~> 2.0.1" end -gem "bootsnap", "~> 1.19.0", require: false +gem "bootsnap", "~> 1.20.0", require: false # API gems gem "grape", "~> 2.4.0" @@ -404,7 +408,7 @@ group :postgres do end # Support application loading when no database exists yet. -gem "activerecord-nulldb-adapter", "~> 1.1.1" +gem "activerecord-nulldb-adapter", "~> 1.2.2" # Have application level locks on the database to have a mutex shared between workers/hosts. # We e.g. employ this to safeguard the creation of journals. @@ -424,4 +428,4 @@ end gem "openproject-octicons", "~>19.32.0" gem "openproject-octicons_helper", "~>19.32.0" -gem "openproject-primer_view_components", "~>0.79.1" +gem "openproject-primer_view_components", "~>0.80.2" diff --git a/Gemfile.lock b/Gemfile.lock index f746cfd6c67..c7cbde0ebfb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -36,10 +36,10 @@ GIT GIT remote: https://github.com/opf/omniauth-openid-connect.git - revision: f0c1ecdb26e39017a9e929af75a166c772d960bb - ref: f0c1ecdb26e39017a9e929af75a166c772d960bb + revision: 825d06235b64f6bc872bba709f1c2d48fd5cede4 + ref: 825d06235b64f6bc872bba709f1c2d48fd5cede4 specs: - omniauth-openid-connect (0.4.2) + omniauth-openid-connect (0.5.0) addressable (~> 2.5) omniauth (~> 1.6) openid_connect (~> 2.2.0) @@ -203,7 +203,7 @@ PATH remote: modules/two_factor_authentication specs: openproject-two_factor_authentication (1.0.0) - aws-sdk-sns (>= 1.101, < 1.110) + aws-sdk-sns (>= 1.101, < 1.112) messagebird-rest (>= 1.4.2, < 5.1.0) rotp (~> 6.1) webauthn (~> 3.0) @@ -286,8 +286,8 @@ GEM timeout (>= 0.4.0) activerecord-import (2.2.0) activerecord (>= 4.2) - activerecord-nulldb-adapter (1.1.1) - activerecord (>= 6.0, < 8.1) + activerecord-nulldb-adapter (1.2.2) + activerecord (>= 6.1, < 8.2) activerecord-session_store (2.2.0) actionpack (>= 7.0) activerecord (>= 7.0) @@ -318,8 +318,8 @@ GEM activesupport (>= 6.1) acts_as_tree (2.9.1) activerecord (>= 3.0.0) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) aes_key_wrap (1.1.0) afm (1.0.0) airbrake (13.0.5) @@ -329,18 +329,18 @@ GEM android_key_attestation (0.3.0) anyway_config (2.7.2) ruby-next-core (~> 1.0) - appsignal (4.7.5) + appsignal (4.8.1) logger rack (>= 2.0.0) ast (2.4.3) attr_required (1.0.2) auto_strip_attributes (2.6.0) activerecord (>= 4.0) - awesome_nested_set (3.8.0) - activerecord (>= 4.0.0, < 8.1) + awesome_nested_set (3.9.0) + activerecord (>= 4.0.0, < 8.2) aws-eventstream (1.4.0) - aws-partitions (1.1188.0) - aws-sdk-core (3.239.2) + aws-partitions (1.1202.0) + aws-sdk-core (3.241.3) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -348,15 +348,15 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.118.0) - aws-sdk-core (~> 3, >= 3.239.1) + aws-sdk-kms (1.120.0) + aws-sdk-core (~> 3, >= 3.241.3) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.205.0) - aws-sdk-core (~> 3, >= 3.234.0) + aws-sdk-s3 (1.211.0) + aws-sdk-core (~> 3, >= 3.241.3) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sdk-sns (1.109.0) - aws-sdk-core (~> 3, >= 3.239.1) + aws-sdk-sns (1.111.0) + aws-sdk-core (~> 3, >= 3.241.3) aws-sigv4 (~> 1.5) aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) @@ -374,20 +374,20 @@ GEM ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) base64 (0.3.0) - bcrypt (3.1.20) + bcrypt (3.1.21) benchmark (0.5.0) - better_html (2.1.1) - actionview (>= 6.0) - activesupport (>= 6.0) + better_html (2.2.0) + actionview (>= 7.0) + activesupport (>= 7.0) ast (~> 2.0) erubi (~> 1.4) parser (>= 2.4) smart_properties bigdecimal (3.3.1) bindata (2.5.1) - bootsnap (1.19.0) + bootsnap (1.20.1) msgpack (~> 1.2) - brakeman (7.1.1) + brakeman (7.1.2) racc browser (6.2.0) builder (3.3.0) @@ -413,7 +413,7 @@ GEM carrierwave (>= 1.0.0) fog-aws cbor (0.5.10.1) - cgi (0.5.0) + cgi (0.5.1) childprocess (5.1.0) logger (~> 1.5) climate_control (1.2.0) @@ -426,18 +426,15 @@ GEM descendants_tracker (~> 0.0.1) color_conversion (0.1.2) colored2 (4.0.3) - commonmarker (2.6.0) - rb_sys (~> 0.9) - commonmarker (2.6.0-aarch64-linux) - commonmarker (2.6.0-aarch64-linux-musl) - commonmarker (2.6.0-arm64-darwin) - commonmarker (2.6.0-x86_64-darwin) - commonmarker (2.6.0-x86_64-linux) - commonmarker (2.6.0-x86_64-linux-musl) + commonmarker (2.6.1-aarch64-linux) + commonmarker (2.6.1-arm-linux) + commonmarker (2.6.1-arm64-darwin) + commonmarker (2.6.1-x86_64-darwin) + commonmarker (2.6.1-x86_64-linux) compare-xml (0.66) nokogiri (~> 1.8) - concurrent-ruby (1.3.5) - connection_pool (2.5.4) + concurrent-ruby (1.3.6) + connection_pool (2.5.5) cookiejar (0.3.4) cose (1.3.1) cbor (~> 0.5.9) @@ -457,14 +454,14 @@ GEM ferrum (~> 0.17.0) daemons (1.4.1) dalli (3.2.8) - date (3.5.0) + date (3.5.1) date_validator (0.12.0) activemodel (>= 3) activesupport (>= 3) deckar01-task_list (2.3.4) html-pipeline (~> 2.0) declarative (0.0.20) - dentaku (3.5.6) + dentaku (3.5.7) bigdecimal concurrent-ruby descendants_tracker (0.0.4) @@ -475,9 +472,9 @@ GEM representable (>= 3.1.1, < 4) doorkeeper (5.8.2) railties (>= 5) - dotenv (3.1.8) - dotenv-rails (3.1.8) - dotenv (= 3.1.8) + dotenv (3.2.0) + dotenv-rails (3.2.0) + dotenv (= 3.2.0) railties (>= 6.1) drb (2.2.3) dry-configurable (1.3.0) @@ -485,7 +482,7 @@ GEM zeitwerk (~> 2.6) dry-container (0.11.0) concurrent-ruby (~> 1.0) - dry-core (1.1.0) + dry-core (1.2.0) concurrent-ruby (~> 1.0) logger zeitwerk (~> 2.6) @@ -537,7 +534,7 @@ GEM activemodel equivalent-xml (0.6.0) nokogiri (>= 1.4.3) - erb (6.0.0) + erb (6.0.1) erb_lint (0.9.0) activesupport better_html (>= 2.0.1) @@ -552,7 +549,7 @@ GEM tzinfo eventmachine (1.2.7) eventmachine_httpserver (0.2.1) - excon (1.3.0) + excon (1.3.2) logger factory_bot (6.5.6) activesupport (>= 6.1.0) @@ -563,7 +560,7 @@ GEM faraday-net_http (>= 2.0, < 3.5) json logger - faraday-follow_redirects (0.4.0) + faraday-follow_redirects (0.5.0) faraday (>= 1, < 3) faraday-net_http (3.4.2) net-http (~> 0.5) @@ -574,17 +571,14 @@ GEM concurrent-ruby (~> 1.1) webrick (~> 1.7) websocket-driver (~> 0.7) - ffi (1.17.2) - ffi (1.17.2-aarch64-linux-gnu) - ffi (1.17.2-aarch64-linux-musl) - ffi (1.17.2-arm-linux-gnu) - ffi (1.17.2-arm-linux-musl) - ffi (1.17.2-arm64-darwin) - ffi (1.17.2-x86-linux-gnu) - ffi (1.17.2-x86-linux-musl) - ffi (1.17.2-x86_64-darwin) - ffi (1.17.2-x86_64-linux-gnu) - ffi (1.17.2-x86_64-linux-musl) + ffi (1.17.3-aarch64-linux-gnu) + ffi (1.17.3-aarch64-linux-musl) + ffi (1.17.3-arm-linux-gnu) + ffi (1.17.3-arm-linux-musl) + ffi (1.17.3-arm64-darwin) + ffi (1.17.3-x86_64-darwin) + ffi (1.17.3-x86_64-linux-gnu) + ffi (1.17.3-x86_64-linux-musl) flamegraph (0.9.5) fog-aws (3.33.1) base64 (>= 0.2, < 0.4) @@ -602,9 +596,9 @@ GEM fog-xml (0.1.5) fog-core nokogiri (>= 1.5.11, < 2.0.0) - formatador (1.2.2) + formatador (1.2.3) reline - friendly_id (5.5.1) + friendly_id (5.6.0) activerecord (>= 4.0.0) front_matter_parser (1.0.1) fugit (1.12.1) @@ -631,42 +625,36 @@ GEM mini_mime (~> 1.1) representable (~> 3.0) retriable (~> 3.1) - google-apis-gmail_v1 (0.46.0) + google-apis-gmail_v1 (0.47.0) google-apis-core (>= 0.15.0, < 2.a) google-cloud-env (2.3.1) base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-logging-utils (0.2.0) - google-protobuf (4.32.1) + google-protobuf (4.33.2) bigdecimal rake (>= 13) - google-protobuf (4.32.1-aarch64-linux-gnu) + google-protobuf (4.33.2-aarch64-linux-gnu) bigdecimal rake (>= 13) - google-protobuf (4.32.1-aarch64-linux-musl) + google-protobuf (4.33.2-aarch64-linux-musl) bigdecimal rake (>= 13) - google-protobuf (4.32.1-arm64-darwin) + google-protobuf (4.33.2-arm64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.32.1-x86-linux-gnu) + google-protobuf (4.33.2-x86_64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.32.1-x86-linux-musl) + google-protobuf (4.33.2-x86_64-linux-gnu) bigdecimal rake (>= 13) - google-protobuf (4.32.1-x86_64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-linux-musl) + google-protobuf (4.33.2-x86_64-linux-musl) bigdecimal rake (>= 13) googleapis-common-protos-types (1.22.0) google-protobuf (~> 4.26) - googleauth (1.15.1) + googleauth (1.16.0) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -687,7 +675,8 @@ GEM hana (1.3.7) hashdiff (1.2.1) hashery (2.1.2) - hashie (5.0.0) + hashie (5.1.0) + logger highline (3.1.2) reline html-pipeline (2.14.3) @@ -697,15 +686,15 @@ GEM htmldiff (0.0.1) htmlentities (4.3.4) http-2 (1.1.1) - http_parser.rb (0.8.0) + http_parser.rb (0.8.1) httpx (1.6.3) http-2 (>= 1.0.0) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) i18n-js (4.2.4) glob (>= 0.4.0) i18n - i18n-tasks (1.1.0) + i18n-tasks (1.1.2) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi @@ -728,14 +717,14 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) interception (0.5) - io-console (0.8.1) - irb (1.15.3) + io-console (0.8.2) + irb (1.16.0) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) iso8601 (0.13.0) jmespath (1.6.2) - json (2.16.0) + json (2.18.0) json-jwt (1.17.0) activesupport (>= 4.2) aes_key_wrap @@ -745,7 +734,8 @@ GEM faraday-follow_redirects json-schema (4.3.1) addressable (>= 2.8) - json_schemer (2.4.0) + json_rpc_handler (0.1.1) + json_schemer (2.5.0) bigdecimal hana (~> 1.3) regexp_parser (~> 2.0) @@ -762,7 +752,7 @@ GEM addressable (~> 2.8) childprocess (~> 5.0) logger (~> 1.6) - lefthook (2.0.4) + lefthook (2.0.13) letter_opener (1.10.0) launchy (>= 2.2, < 4) letter_opener_web (3.0.0) @@ -784,10 +774,10 @@ GEM activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.24.1) + loofah (2.25.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - lookbook (2.3.13) + lookbook (2.3.14) activemodel css_parser htmlbeautifier (~> 1.3) @@ -806,8 +796,11 @@ GEM net-pop net-smtp marcel (1.1.0) - markly (0.14.1) + markly (0.15.2) matrix (0.4.3) + mcp (0.4.0) + json-schema (>= 4.1) + json_rpc_handler (~> 0.1) messagebird-rest (5.0.0) jwt (< 4) meta-tags (2.22.2) @@ -820,17 +813,17 @@ GEM mini_magick (5.3.1) logger mini_mime (1.1.5) - mini_portile2 (2.8.9) - minitest (5.26.2) + minitest (6.0.1) + prism (~> 1.5) msgpack (1.8.0) - multi_json (1.17.0) + multi_json (1.19.1) mustermann (3.0.4) ruby2_keywords (~> 0.0.1) mustermann-grape (1.1.0) mustermann (>= 1.0.0) - net-http (0.8.0) + net-http (0.9.1) uri (>= 0.11.1) - net-imap (0.5.12) + net-imap (0.6.2) date net-protocol net-ldap (0.20.0) @@ -842,30 +835,28 @@ GEM timeout net-smtp (0.5.1) net-protocol - nio4r (2.7.4) - nokogiri (1.18.10) - mini_portile2 (~> 2.8.2) + nio4r (2.7.5) + nokogiri (1.19.0-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.10-aarch64-linux-gnu) + nokogiri (1.19.0-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.18.10-aarch64-linux-musl) + nokogiri (1.19.0-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.10-arm-linux-gnu) + nokogiri (1.19.0-arm-linux-musl) racc (~> 1.4) - nokogiri (1.18.10-arm-linux-musl) + nokogiri (1.19.0-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.10-arm64-darwin) + nokogiri (1.19.0-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.10-x86_64-darwin) + nokogiri (1.19.0-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.10-x86_64-linux-gnu) + nokogiri (1.19.0-x86_64-linux-musl) racc (~> 1.4) - nokogiri (1.18.10-x86_64-linux-musl) - racc (~> 1.4) - oj (3.16.12) + oj (3.16.13) bigdecimal (>= 3.0) ostruct (>= 0.2) - okcomputer (1.19.0) + okcomputer (1.19.1) + benchmark omniauth-saml (1.10.6) omniauth (~> 1.3, >= 1.3.2) ruby-saml (~> 1.18) @@ -888,32 +879,32 @@ GEM actionview openproject-octicons (= 19.32.0) railties - openproject-primer_view_components (0.79.1) + openproject-primer_view_components (0.80.2) actionview (>= 7.2.0) activesupport (>= 7.2.0) openproject-octicons (>= 19.30.1) view_component (>= 3.1, < 5.0) - openproject-token (8.3.0) + openproject-token (8.6.0) activemodel - openssl (3.3.1) + openssl (4.0.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) opentelemetry-api (1.7.0) opentelemetry-common (0.23.0) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.31.0) + opentelemetry-exporter-otlp (0.31.1) google-protobuf (>= 3.18) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) - opentelemetry-sdk (~> 1.2) + opentelemetry-sdk (~> 1.10) opentelemetry-semantic_conventions opentelemetry-helpers-mysql (0.4.0) opentelemetry-api (~> 1.7) opentelemetry-common (~> 0.21) opentelemetry-helpers-sql (0.3.0) opentelemetry-api (~> 1.7) - opentelemetry-helpers-sql-obfuscation (0.5.0) + opentelemetry-helpers-sql-processor (0.3.1) opentelemetry-common (~> 0.21) opentelemetry-instrumentation-action_mailer (0.6.1) opentelemetry-instrumentation-active_support (~> 0.10) @@ -931,7 +922,7 @@ GEM opentelemetry-instrumentation-active_support (~> 0.10) opentelemetry-instrumentation-active_support (0.10.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-all (0.87.0) + opentelemetry-instrumentation-all (0.89.1) opentelemetry-instrumentation-active_model_serializers (~> 0.24.0) opentelemetry-instrumentation-anthropic (~> 0.3.0) opentelemetry-instrumentation-aws_lambda (~> 0.6.0) @@ -940,7 +931,7 @@ GEM opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0) opentelemetry-instrumentation-dalli (~> 0.29.0) opentelemetry-instrumentation-delayed_job (~> 0.25.1) - opentelemetry-instrumentation-ethon (~> 0.25.0) + opentelemetry-instrumentation-ethon (~> 0.26.0) opentelemetry-instrumentation-excon (~> 0.26.0) opentelemetry-instrumentation-faraday (~> 0.30.0) opentelemetry-instrumentation-grape (~> 0.5.0) @@ -953,10 +944,10 @@ GEM opentelemetry-instrumentation-koala (~> 0.23.0) opentelemetry-instrumentation-lmdb (~> 0.25.0) opentelemetry-instrumentation-mongo (~> 0.25.0) - opentelemetry-instrumentation-mysql2 (~> 0.31.0) + opentelemetry-instrumentation-mysql2 (~> 0.32.1) opentelemetry-instrumentation-net_http (~> 0.26.0) - opentelemetry-instrumentation-pg (~> 0.33.0) - opentelemetry-instrumentation-que (~> 0.11.1) + opentelemetry-instrumentation-pg (~> 0.34.1) + opentelemetry-instrumentation-que (~> 0.12.0) opentelemetry-instrumentation-racecar (~> 0.6.0) opentelemetry-instrumentation-rack (~> 0.29.0) opentelemetry-instrumentation-rails (~> 0.39.1) @@ -966,9 +957,9 @@ GEM opentelemetry-instrumentation-resque (~> 0.8.0) opentelemetry-instrumentation-restclient (~> 0.26.0) opentelemetry-instrumentation-ruby_kafka (~> 0.24.0) - opentelemetry-instrumentation-sidekiq (~> 0.28.0) + opentelemetry-instrumentation-sidekiq (~> 0.28.1) opentelemetry-instrumentation-sinatra (~> 0.28.0) - opentelemetry-instrumentation-trilogy (~> 0.64.0) + opentelemetry-instrumentation-trilogy (~> 0.65.1) opentelemetry-instrumentation-anthropic (0.3.0) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-aws_lambda (0.6.0) @@ -987,11 +978,11 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-delayed_job (0.25.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-ethon (0.25.0) + opentelemetry-instrumentation-ethon (0.26.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-excon (0.26.0) + opentelemetry-instrumentation-excon (0.26.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-faraday (0.30.0) + opentelemetry-instrumentation-faraday (0.30.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-grape (0.5.0) opentelemetry-instrumentation-rack (~> 0.29) @@ -1001,11 +992,11 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-gruf (0.5.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http (0.27.0) + opentelemetry-instrumentation-http (0.27.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http_client (0.26.0) + opentelemetry-instrumentation-http_client (0.26.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-httpx (0.5.0) + opentelemetry-instrumentation-httpx (0.5.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-koala (0.23.0) opentelemetry-instrumentation-base (~> 0.25) @@ -1013,20 +1004,20 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-mongo (0.25.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-mysql2 (0.31.0) + opentelemetry-instrumentation-mysql2 (0.32.1) opentelemetry-helpers-mysql opentelemetry-helpers-sql - opentelemetry-helpers-sql-obfuscation + opentelemetry-helpers-sql-processor opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-net_http (0.26.0) + opentelemetry-instrumentation-net_http (0.26.1) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-pg (0.33.0) + opentelemetry-instrumentation-pg (0.34.1) opentelemetry-helpers-sql - opentelemetry-helpers-sql-obfuscation + opentelemetry-helpers-sql-processor opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-que (0.11.1) + opentelemetry-instrumentation-que (0.12.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-racecar (0.6.0) + opentelemetry-instrumentation-racecar (0.6.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-rack (0.29.0) opentelemetry-instrumentation-base (~> 0.25) @@ -1051,14 +1042,14 @@ GEM opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-ruby_kafka (0.24.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-sidekiq (0.28.0) + opentelemetry-instrumentation-sidekiq (0.28.1) opentelemetry-instrumentation-base (~> 0.25) opentelemetry-instrumentation-sinatra (0.28.0) opentelemetry-instrumentation-rack (~> 0.29) - opentelemetry-instrumentation-trilogy (0.64.0) + opentelemetry-instrumentation-trilogy (0.65.1) opentelemetry-helpers-mysql opentelemetry-helpers-sql - opentelemetry-helpers-sql-obfuscation + opentelemetry-helpers-sql-processor opentelemetry-instrumentation-base (~> 0.25) opentelemetry-semantic_conventions (>= 1.8.0) opentelemetry-registry (0.4.0) @@ -1075,7 +1066,7 @@ GEM ostruct (0.6.3) ox (2.14.23) bigdecimal (>= 3.0) - pagy (43.1.5) + pagy (43.2.2) json yaml paper_trail (17.0.0) @@ -1090,20 +1081,20 @@ GEM pdf-core (0.9.0) pdf-inspector (1.3.0) pdf-reader (>= 1.0, < 3.0.a) - pdf-reader (2.15.0) + pdf-reader (2.15.1) Ascii85 (>= 1.0, < 3.0, != 2.0.0) afm (>= 0.2.1, < 2) hashery (~> 2.0) ruby-rc4 ttfunk - pg (1.6.2) - pg (1.6.2-aarch64-linux) - pg (1.6.2-aarch64-linux-musl) - pg (1.6.2-arm64-darwin) - pg (1.6.2-x86_64-darwin) - pg (1.6.2-x86_64-linux) - pg (1.6.2-x86_64-linux-musl) - plaintext (0.3.6) + pg (1.6.3) + pg (1.6.3-aarch64-linux) + pg (1.6.3-aarch64-linux-musl) + pg (1.6.3-arm64-darwin) + pg (1.6.3-x86_64-darwin) + pg (1.6.3-x86_64-linux) + pg (1.6.3-x86_64-linux-musl) + plaintext (0.3.7) activesupport (> 2.2.1) nokogiri (~> 1.10, >= 1.10.4) rubyzip (>= 1.2.0) @@ -1115,42 +1106,42 @@ GEM prawn-table (0.2.2) prawn (>= 1.3.0, < 3.0.0) prettyprint (0.2.0) - prism (1.6.0) - prometheus-client-mmap (1.2.10) + prism (1.8.0) + prometheus-client-mmap (1.5.0) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-aarch64-linux-gnu) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-aarch64-linux-gnu) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-aarch64-linux-musl) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-aarch64-linux-musl) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-arm64-darwin) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-arm64-darwin) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-x86_64-darwin) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-x86_64-darwin) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-x86_64-linux-gnu) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-x86_64-linux-gnu) base64 bigdecimal logger - rb_sys (~> 0.9.109) - prometheus-client-mmap (1.2.10-x86_64-linux-musl) + rb_sys (~> 0.9.124) + prometheus-client-mmap (1.5.0-x86_64-linux-musl) base64 bigdecimal logger - rb_sys (~> 0.9.109) + rb_sys (~> 0.9.124) pry (0.15.2) coderay (~> 1.1) method_source (~> 1.0) @@ -1162,10 +1153,10 @@ GEM pry-rescue (1.6.0) interception (>= 0.5) pry (>= 0.12.0) - psych (5.2.6) + psych (5.3.1) date stringio - public_suffix (6.0.2) + public_suffix (7.0.2) puffing-billy (4.0.2) addressable (~> 2.5) em-http-request (~> 1.1, >= 1.1.0) @@ -1187,7 +1178,7 @@ GEM rack (>= 2.0.0) rack-mini-profiler (4.0.1) rack (>= 1.2.0) - rack-oauth2 (2.2.1) + rack-oauth2 (2.3.0) activesupport attr_required faraday (~> 2.0) @@ -1233,7 +1224,7 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - rails-i18n (8.0.2) + rails-i18n (8.1.0) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) railties (8.0.4) @@ -1247,18 +1238,18 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.3.1) - rake-compiler-dock (1.9.1) + rake-compiler-dock (1.11.0) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rb_sys (0.9.117) - rake-compiler-dock (= 1.9.1) - rbtrace (0.5.2) + rb_sys (0.9.124) + rake-compiler-dock (= 1.11.0) + rbtrace (0.5.3) ffi (>= 1.0.6) msgpack (>= 0.4.3) optimist (>= 3.0.0) rbtree3 (0.7.1) - rdoc (6.15.1) + rdoc (7.1.0) erb psych (>= 4.0.0) tsort @@ -1266,7 +1257,7 @@ GEM redcarpet (3.6.1) redis (5.4.1) redis-client (>= 0.22.0) - redis-client (0.25.2) + redis-client (0.26.2) connection_pool regexp_parser (2.11.3) reline (0.6.3) @@ -1286,7 +1277,7 @@ GEM roar (1.2.0) representable (~> 3.1) rotp (6.3.0) - rouge (4.6.1) + rouge (4.7.0) rspec (3.13.2) rspec-core (~> 3.13.0) rspec-expectations (~> 3.13.0) @@ -1296,7 +1287,7 @@ GEM rspec-expectations (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.6) + rspec-mocks (3.13.7) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-rails (8.0.2) @@ -1312,7 +1303,7 @@ GEM rspec-support (3.13.6) rspec-wait (1.0.2) rspec (>= 3.4) - rubocop (1.81.7) + rubocop (1.82.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -1320,12 +1311,12 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.47.1, < 2.0) + rubocop-ast (>= 1.48.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.48.0) + rubocop-ast (1.49.0) parser (>= 3.3.7.2) - prism (~> 1.4) + prism (~> 1.7) rubocop-capybara (2.22.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) @@ -1338,7 +1329,7 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.47.1, < 2.0) - rubocop-rails (2.33.3) + rubocop-rails (2.34.3) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) @@ -1373,12 +1364,12 @@ GEM sanitize (7.0.0) crass (~> 1.0.2) nokogiri (>= 1.16.8) - scimitar (2.13.0) + scimitar (2.14.0) rails (>= 7.0) securerandom (0.4.1) - selenium-devtools (0.142.0) + selenium-devtools (0.143.0) selenium-webdriver (~> 4.2) - selenium-webdriver (4.38.0) + selenium-webdriver (4.39.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -1417,7 +1408,7 @@ GEM store_attribute (2.0.1) activerecord (>= 6.1) stringex (2.8.6) - stringio (3.1.8) + stringio (3.2.0) structured_warnings (0.5.0) svg-graph (2.2.2) swd (2.0.3) @@ -1425,7 +1416,7 @@ GEM attr_required (>= 0.0.5) faraday (~> 2.0) faraday-follow_redirects - sys-filesystem (1.5.4) + sys-filesystem (1.5.5) ffi (~> 1.1) table_print (1.5.7) terminal-table (4.0.0) @@ -1435,7 +1426,7 @@ GEM thor (1.4.0) thread_safe (0.3.6) timecop (0.9.10) - timeout (0.4.4) + timeout (0.6.0) tpm-key_attestation (0.14.1) bindata (~> 2.4) openssl (> 2.0) @@ -1450,12 +1441,12 @@ GEM turbo-rails (>= 1.3.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.2) + tzinfo-data (1.2025.3) tzinfo (>= 1.0.0) uber (0.1.0) unicode-display_width (3.2.0) unicode-emoji (~> 4.1) - unicode-emoji (4.1.0) + unicode-emoji (4.2.0) uri (1.1.1) useragent (0.16.11) validate_email (0.1.6) @@ -1464,12 +1455,11 @@ GEM validate_url (1.0.15) activemodel (>= 3.0.0) public_suffix - vcr (6.3.1) - base64 - vernier (1.8.1) - view_component (4.1.1) - actionview (>= 7.1.0, < 8.2) - activesupport (>= 7.1.0, < 8.2) + vcr (6.4.0) + vernier (1.9.0) + view_component (4.2.0) + actionview (>= 7.1.0) + activesupport (>= 7.1.0) concurrent-ruby (~> 1) virtus (2.0.0) axiom-types (~> 0.1) @@ -1495,7 +1485,7 @@ GEM addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.9.1) + webrick (1.9.2) websocket (1.2.11) websocket-driver (0.8.0) base64 @@ -1518,18 +1508,18 @@ GEM yabeda-prometheus-mmap (0.4.0) prometheus-client-mmap yabeda (~> 0.10) - yabeda-puma-plugin (0.8.0) + yabeda-puma-plugin (0.9.0) json puma yabeda (~> 0.5) - yabeda-rails (0.10.0) + yabeda-rails (0.11.0) activesupport anyway_config (>= 1.3, < 3) railties yabeda (~> 0.8) yaml (0.4.0) - yard (0.9.37) - zeitwerk (2.7.3) + yard (0.9.38) + zeitwerk (2.7.4) PLATFORMS aarch64-linux @@ -1538,9 +1528,6 @@ PLATFORMS arm-linux-gnu arm-linux-musl arm64-darwin - ruby - x86-linux-gnu - x86-linux-musl x86_64-darwin x86_64-linux x86_64-linux-gnu @@ -1551,7 +1538,7 @@ DEPENDENCIES active_record_doctor (~> 2.0.1) activemodel-serializers-xml (~> 1.0.1) activerecord-import (~> 2.2.0) - activerecord-nulldb-adapter (~> 1.1.1) + activerecord-nulldb-adapter (~> 1.2.2) activerecord-session_store (~> 2.2.0) acts_as_list (~> 1.2.6) acts_as_tree (~> 2.9.0) @@ -1559,12 +1546,12 @@ DEPENDENCIES airbrake (~> 13.0.0) appsignal (~> 4.7) auto_strip_attributes (~> 2.5) - awesome_nested_set (~> 3.8.0) - aws-sdk-core (~> 3.239) - aws-sdk-s3 (~> 1.205) + awesome_nested_set (~> 3.9.0) + aws-sdk-core (~> 3.241) + aws-sdk-s3 (~> 1.211) axe-core-rspec bcrypt (~> 3.1.6) - bootsnap (~> 1.19.0) + bootsnap (~> 1.20.0) brakeman (~> 7.1.1) browser (~> 6.2.0) budgets! @@ -1579,6 +1566,7 @@ DEPENDENCIES colored2 commonmarker (~> 2.6.0) compare-xml (~> 0.66) + connection_pool (~> 2.5.5) costs! counter_culture (~> 3.11) csv (~> 3.3) @@ -1604,7 +1592,7 @@ DEPENDENCIES ffi (~> 1.15) flamegraph fog-aws - friendly_id (~> 5.5.0) + friendly_id (~> 5.6.0) fuubar (~> 2.5.0) globalid (~> 1.3) good_job (~> 4.12.0) @@ -1621,7 +1609,7 @@ DEPENDENCIES ice_cube (~> 0.17.0) ice_nine inline_svg (~> 1.10.0) - json_schemer (~> 2.4.0) + json_schemer (~> 2.5.0) json_spec (~> 1.1.4) ladle launchy (~> 3.1.0) @@ -1629,19 +1617,20 @@ DEPENDENCIES letter_opener_web listen (~> 3.9.0) lograge (~> 0.14.0) - lookbook (= 2.3.13) + lookbook (= 2.3.14) mail (= 2.9.0) - markly (~> 0.14) + markly (~> 0.15) matrix (~> 0.4.3) + mcp (~> 0.4.0) md_to_pdf! meta-tags (~> 2.22.2) mini_magick (~> 5.3.0) - multi_json (~> 1.17.0) + multi_json (~> 1.19.0) my_page! net-ldap (~> 0.20.0) - nokogiri (~> 1.18.10) + nokogiri (~> 1.19.0) oj (~> 3.16.12) - okcomputer (~> 1.19.0) + okcomputer (~> 1.19.1) omniauth! omniauth-openid-connect! omniauth-openid_connect-providers! @@ -1663,17 +1652,17 @@ DEPENDENCIES openproject-octicons (~> 19.32.0) openproject-octicons_helper (~> 19.32.0) openproject-openid_connect! - openproject-primer_view_components (~> 0.79.1) + openproject-primer_view_components (~> 0.80.2) openproject-recaptcha! openproject-reporting! openproject-storages! openproject-team_planner! - openproject-token (~> 8.3.0) + openproject-token (~> 8.6.0) openproject-two_factor_authentication! openproject-webhooks! openproject-xls_export! opentelemetry-exporter-otlp (~> 0.31.0) - opentelemetry-instrumentation-all (~> 0.87.0) + opentelemetry-instrumentation-all (~> 0.89.0) opentelemetry-sdk (~> 1.10) overviews! ox @@ -1682,7 +1671,7 @@ DEPENDENCIES parallel_tests (~> 4.0) pdf-inspector (~> 1.2) pg (~> 1.6.2) - plaintext (~> 0.3.2) + plaintext (~> 0.3.7) prawn (~> 2.4) pry-byebug (~> 3.11.0) pry-rails (~> 0.3.6) @@ -1699,7 +1688,7 @@ DEPENDENCIES rack_session_access rails (~> 8.0.4) rails-controller-testing (~> 1.0.2) - rails-i18n (~> 8.0.0) + rails-i18n (~> 8.1.0) rbtrace rdoc (>= 2.4.2) redis (~> 5.4.0) @@ -1708,7 +1697,7 @@ DEPENDENCIES retriable (~> 3.1.1) rinku (~> 2.0.4) roar (~> 1.2.0) - rouge (~> 4.6.1) + rouge (~> 4.7.0) rspec (~> 3.13.2) rspec-rails (~> 8.0.0) rspec-retry (~> 0.6.1) @@ -1718,7 +1707,7 @@ DEPENDENCIES rubocop-factory_bot rubocop-openproject rubocop-performance - rubocop-rails (= 2.33.3) + rubocop-rails (~> 2.34.2) rubocop-rspec rubocop-rspec_rails ruby-duration (~> 3.2.0) @@ -1754,7 +1743,7 @@ DEPENDENCIES validate_url vcr vernier - view_component (~> 4.1.1) + view_component (~> 4.2.0) warden (~> 1.2) warden-basic_auth (~> 0.2.1) webmock (~> 3.26) @@ -1780,42 +1769,42 @@ CHECKSUMS activemodel-serializers-xml (1.0.3) sha256=fa1b16305e7254cc58a59c68833e3c0a593a59c8ab95d3be5aaea7cd9416c397 activerecord (8.0.4) sha256=bda32c171799e5ca5460447d3b7272ed14447244e2497abf2107f87fc44cbf32 activerecord-import (2.2.0) sha256=f8ca99b196e50775723d1f1d192c379f656378dc9f5628240992a0d78807fa4b - activerecord-nulldb-adapter (1.1.1) sha256=034c91106183b954b072fba14c2786adf1a2b9e852ce04f85f823afaf03e9820 + activerecord-nulldb-adapter (1.2.2) sha256=01e0b2e49af11ad56a92e274a3d8c9fb3c50a12a5460218c4c4b45355d9ef968 activerecord-session_store (2.2.0) sha256=65918054573683bf4f87af89e765e1fece14c9d71cfac1f11abe4687c96e2743 activestorage (8.0.4) sha256=47f312962fc898c1669f20cf7448d19668a5547f4a5f64e59a837d9d3f64a043 activesupport (8.0.4) sha256=894a3a6c7733b5fae5a7df3acd76c4b563f38687df8a04fa3cbd25360f3fe95a acts_as_list (1.2.6) sha256=8345380900b7bee620c07ad00991ccee59af3d8c9e8574f426e321da2865fdc8 acts_as_tree (2.9.1) sha256=b869eb10a8de38616b64ffcf9e882d3d99c8e06909c4057078a76c3b89a9a2f3 - addressable (2.8.7) sha256=462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232 + addressable (2.8.8) sha256=7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057 aes_key_wrap (1.1.0) sha256=b935f4756b37375895db45669e79dfcdc0f7901e12d4e08974d5540c8e0776a5 afm (1.0.0) sha256=5bd4d6f6241e7014ef090985ec6f4c3e9745f6de0828ddd58bc1efdd138f4545 airbrake (13.0.5) sha256=901f5074c25d5ef77ed87f5bde7a28400a7324f5d7013a8a12d07e0099cc31b6 airbrake-ruby (6.2.2) sha256=293e34fb36e763e1b6d67ab584cce7c5b6fe9eea1a70c26d8c13c0f5d7de2fbc android_key_attestation (0.3.0) sha256=467eb01a99d2bb48ef9cf24cc13712669d7056cba5a52d009554ff037560570b anyway_config (2.7.2) sha256=30f6b087c0b41afdd43fe46c81d65a16f052a8489dab453abaeb4ea67aa74bad - appsignal (4.7.5) sha256=bfbf741ca742e2d4bf33766ca281f35aa6750819d73fd59d34d11415e4cab494 + appsignal (4.8.1) sha256=69e1db8019ce216aff36a716a0dc9317d4ccebfe5be27db11dbd85de1273cb1e ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0 - awesome_nested_set (3.8.0) sha256=469daff411d80291dbb80d1973133e498048a7afc2519c545f62d2cdebc60eda + awesome_nested_set (3.9.0) sha256=3ce99e816550f97f4de118e621630070aacf24928b920fe4a68846578a8daaed aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b - aws-partitions (1.1188.0) sha256=dff035be9381b37a71295f88608640323de6d0e25c83a1b1932390b03a08af9a - aws-sdk-core (3.239.2) sha256=a6801845ee0bdb061a3f9fb488136f3a585d51ff05b77063a9e228c9539cf239 - aws-sdk-kms (1.118.0) sha256=c9c751596d4f1502adac857c90010f00a9a52370b78e170acb198af7fa716fbd - aws-sdk-s3 (1.205.0) sha256=dcffbd495dfd2d6ba5bc86e7b0c58facb982aae298b328e5f199ece38dea2ee9 - aws-sdk-sns (1.109.0) sha256=71bb33691a8a88a485cefe4fba30dfef352104d82c14c665396534dcde39b811 + aws-partitions (1.1202.0) sha256=c8aa0f134a23464c61cfd00edfb4b6d968b01847a8b591d4dcc0c63a4897c301 + aws-sdk-core (3.241.3) sha256=c7c445ecf1c601c860fd537458b2eb8df0c5df01e63c371849e6594e6b1d4f47 + aws-sdk-kms (1.120.0) sha256=a206ac6f62efbe971f802e8399d2702496a5c5bc800abcf94ead87bdddfdfd80 + aws-sdk-s3 (1.211.0) sha256=2ae5feb09ff4862462824f267b76601ed16922a15de56cf51e4fa99bc5b3f519 + aws-sdk-sns (1.111.0) sha256=195edbd6953d4caa2748bd4861e0fe8df54d90aadf07a0ac268987b946c7e5be aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00 axe-core-api (4.11.0) sha256=3d9c94e3c8f8f9b8f154a3ce036b3dec2dabf7bb7de5e51d663b18bd8a0d691b axe-core-rspec (4.11.0) sha256=3c3e3ef3863d9f5243e056b7da328932c0b6682dda299bb4bd74d760641486d7 axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383 base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b - bcrypt (3.1.20) sha256=8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099 + bcrypt (3.1.21) sha256=5964613d750a42c7ee5dc61f7b9336fb6caca429ba4ac9f2011609946e4a2dcf benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c - better_html (2.1.1) sha256=046c3551d1488a3f2939a7cac6fabf2bde08c32e135c91fcd683380118e5af55 + better_html (2.2.0) sha256=e68ab66ab09696b708333bbf35e8aa3c107500ba7892f528e2111624bdd8cf76 bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218 bindata (2.5.1) sha256=53186a1ec2da943d4cb413583d680644eb810aacbf8902497aac8f191fad9e58 - bootsnap (1.19.0) sha256=d3e54558c1a9ea10cb095eb1eb8e921ae83fd4d5764b8809f63aec18ce9f60b5 - brakeman (7.1.1) sha256=629426b5d6496c75e3ffa2299e1ab1bb3ba721fea03d8808414c083660439498 + bootsnap (1.20.1) sha256=7ad62cda65c5157bcca0acfcc0ee11fcbb83d7d7a8a72d52ccd85e6ffc130b93 + brakeman (7.1.2) sha256=6b04927710a2e7d13a72248b5d404c633188e02417f28f3d853e4b6370d26dce browser (6.2.0) sha256=281d5295788825c9396427c292c2d2be0a5c91875c93c390fde6e5d61a5ace2d budgets (1.0.0) builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f @@ -1826,7 +1815,7 @@ CHECKSUMS carrierwave (1.3.4) sha256=81772dabd1830edbd7f4526d2ae2c79f974f1d48900c3f03f7ecb7c657463a21 carrierwave_direct (2.1.0) sha256=b0d5c19c1d17a05940e488cff644a3b2946422d6d494b2174b48f6a90c5dddbf cbor (0.5.10.1) sha256=79cdf79f18dcd9ee97e0b849c6d573e5a2e3ddc1954d180f384d6ed2612b6df0 - cgi (0.5.0) sha256=fe99f65bb2c146e294372ebb27602adbc3b4c008e9ea7038c6bd48c1ec9759da + cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec climate_control (1.2.0) sha256=36b21896193fa8c8536fa1cd843a07cf8ddbd03aaba43665e26c53ec1bd70aa5 closure_tree (9.3.0) sha256=0da5587c83963861d49b4b5f1217e1baa782b89b62aba0b15d4ad872fa43dce9 @@ -1834,16 +1823,14 @@ CHECKSUMS coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc color_conversion (0.1.2) sha256=99bea5fa412e1527a11389975aa6ad445ff8528ebae202c11d08c45ea2b94c96 colored2 (4.0.3) sha256=63e1038183976287efc43034f5cca17fb180b4deef207da8ba78d051cbce2b37 - commonmarker (2.6.0) sha256=2af2bff39bcf6e52198dca86172f4c691e661eac88667958a40a718106a0f254 - commonmarker (2.6.0-aarch64-linux) sha256=41038a1d4ffe5ac71a2bfbcb9bb2ba569fff6a2b410cecc7cded1a679497cb76 - commonmarker (2.6.0-aarch64-linux-musl) sha256=4b1c1f27e7e433776f0811b29a1380bff00be343ebcf97cbf5d5e407a19c08ba - commonmarker (2.6.0-arm64-darwin) sha256=1e154955c5e32735bec7d5779e0fb1d21e55f46bcfcd43399ec1cbfc105030a0 - commonmarker (2.6.0-x86_64-darwin) sha256=4e139f919fc761147263c7e0a19750c0fe3717e577e7e1b793e6cdb7596c4f94 - commonmarker (2.6.0-x86_64-linux) sha256=cddae70929aea45c6a8aa72bfc02d15029611b0e88fee965d0151bc9453fd8bb - commonmarker (2.6.0-x86_64-linux-musl) sha256=10159e84446362daa92380f0f68fd3818affa86527f0f098d0d08ac49941538e + commonmarker (2.6.1-aarch64-linux) sha256=8279808de1c93a23367271beb1266a5c5f558f729abd2b68975ec89bd8c1e0db + commonmarker (2.6.1-arm-linux) sha256=ee064b7c5d446d841299a0f9a38d7e6d486c44c89b4237695c7d59d8cf256ddb + commonmarker (2.6.1-arm64-darwin) sha256=3f99053bdebd15b1dc060da51f7799655882fd3f4118340bf1485c0a5863365f + commonmarker (2.6.1-x86_64-darwin) sha256=41f1b09c581e2bf42951844ad652aaad543f8f13f1b5b5c18f3cd6dd7b0f3803 + commonmarker (2.6.1-x86_64-linux) sha256=7f43729af032cfb88c0e897f53bf37ad78c6ec28220a0911f5e34b4f041e7ec7 compare-xml (0.66) sha256=e21aa5c0f69ef1177eced997c688fd4df989084e74a1b612257af32e1dd05319 - concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6 - connection_pool (2.5.4) sha256=e9e1922327416091f3f6542f5f4446c2a20745276b9aa796dd0bb2fd0ea1e70a + concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab + connection_pool (2.5.5) sha256=e54ff92855753df1fd7c59fa04a398833355f27dd14c074f8c83a05f72a716ad cookiejar (0.3.4) sha256=11b16acfc4baf7a0f463c21a6212005e04e25f5554d4d9f24d97f3492dfda0df cose (1.3.1) sha256=d5d4dbcd6b035d513edc4e1ab9bc10e9ce13b4011c96e3d1b8fe5e6413fd6de5 costs (1.0.0) @@ -1855,21 +1842,21 @@ CHECKSUMS cuprite (0.17) sha256=b140d5dc70d08b97ad54bcf45cd95d0bd430e291e9dffe76fff851fddd57c12b daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d dalli (3.2.8) sha256=2e63595084d91fae2655514a02c5d4fc0f16c0799893794abe23bf628bebaaa5 - date (3.5.0) sha256=5e74fd6c04b0e65d97ad4f3bb5cb2d8efb37f386cc848f46310b4593ffc46ee5 + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 date_validator (0.12.0) sha256=68c9834da240347b9c17441c553a183572508617ebfbe8c020020f3192ce3058 deckar01-task_list (2.3.4) sha256=66abdc7e009ea759732bb53867e1ea42de550e2aa03ac30a015cbf42a04c1667 declarative (0.0.20) sha256=8021dd6cb17ab2b61233c56903d3f5a259c5cf43c80ff332d447d395b17d9ff9 - dentaku (3.5.6) sha256=88d7241ce9b445a3b8c35e9eee282cbac38b09e5bfc209308ec6bee07dd44db5 + dentaku (3.5.7) sha256=8d15a4a801ac8e1491dd2842bb76e38dd2794e9c8aa0f6e06f59d7ec62727db0 descendants_tracker (0.0.4) sha256=e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 disposable (0.6.3) sha256=7f2a3fb251bff6cd83f25b164043d4ec3531209b51b066ed476a9df9c2d384cc doorkeeper (5.8.2) sha256=a73d07aeaf590b1e7e2a35390446f23131c9f37bc0561653e514d3973f4d50d3 - dotenv (3.1.8) sha256=9e1176060ced581f8e6ce4384e91361817763a76e3c625c8bddc18b35bd392c3 - dotenv-rails (3.1.8) sha256=46c9d1226a8b58a83b5f61325aa8cffd25cea1c0fafdfbbbee1e5dfea77980c4 + dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d + dotenv-rails (3.2.0) sha256=657e25554ba622ffc95d8c4f1670286510f47f2edda9f68293c3f661b303beab drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 dry-configurable (1.3.0) sha256=882d862858567fc1210d2549d4c090f34370fc1bb7c5c1933de3fe792e18afa8 dry-container (0.11.0) sha256=23be9381644d47343f3bf13b082b4255994ada0bfd88e0737eaaadc99d035229 - dry-core (1.1.0) sha256=0903821a9707649a7da545a2cd88e20f3a663ab1c5288abd7f914fa7751ab195 + dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.2.0) sha256=22f5d0b50fd57074ae57e2ca17e3b300e57564c218269dcf82ff3e42d3f38f2e dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2 @@ -1883,7 +1870,7 @@ CHECKSUMS em-synchrony (1.0.6) sha256=6e7470a684d9bbc00d61d552911b65711540bd89e95c157156f5aacdd6f306ca email_validator (2.2.4) sha256=5ab238095bec7aef9389f230e9e0c64c5081cdf91f19d6c5cecee0a93af20604 equivalent-xml (0.6.0) sha256=8919761efa848ad0846369ff8be1f646b17e5061698c4867b09829000cc3f487 - erb (6.0.0) sha256=2730893f9d8c9733f16cab315a4e4b71c1afa9cabc1a1e7ad1403feba8f52579 + erb (6.0.1) sha256=28ecdd99c5472aebd5674d6061e3c6b0a45c049578b071e5a52c2a7f13c197e5 erb_lint (0.9.0) sha256=dfb5e40ad839e8d1f0d56ca85ec9a7ac4c9cd966ec281138282f35b323ca7c31 erblint-github (1.0.1) sha256=9f28f7dc381a0dc68a0093ef7af3424ed9d2bb2b3e39bdc8e8cba86a0d31f2d0 erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 @@ -1891,32 +1878,29 @@ CHECKSUMS et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 eventmachine_httpserver (0.2.1) sha256=5db5e8a23754204d43592e5fcc2160457c57c870babe6307c4e61fc95019b809 - excon (1.3.0) sha256=d83d3bc2a46a74f969406071e0acc32971381a01d7382a79fa75529fb28046be + excon (1.3.2) sha256=a089babe98638e58042a7d542b2bbd183304527e33d612b6dde22fa491a544a5 factory_bot (6.5.6) sha256=12beb373214dccc086a7a63763d6718c49769d5606f0501e0a4442676917e077 factory_bot_rails (6.5.1) sha256=d3cc4851eae4dea8a665ec4a4516895045e710554d2b5ac9e68b94d351bc6d68 faraday (2.14.0) sha256=8699cfe5d97e55268f2596f9a9d5a43736808a943714e3d9a53e6110593941cd - faraday-follow_redirects (0.4.0) sha256=d3fa1118ab1350e24035a272b4cff64948643bb7182846db89acaf87abadd5d9 + faraday-follow_redirects (0.5.0) sha256=5cde93c894b30943a5d2b93c2fe9284216a6b756f7af406a1e55f211d97d10ad faraday-net_http (3.4.2) sha256=f147758260d3526939bf57ecf911682f94926a3666502e24c69992765875906c fastimage (2.4.0) sha256=5fce375e27d3bdbb46c18dbca6ba9af29d3304801ae1eb995771c4796c5ac7e8 ferrum (0.17.1) sha256=51d591120fc593e5a13b5d9d6474389f5145bb92a91e36eab147b5d096c8cbe7 - ffi (1.17.2) sha256=297235842e5947cc3036ebe64077584bff583cd7a4e94e9a02fdec399ef46da6 - ffi (1.17.2-aarch64-linux-gnu) sha256=c910bd3cae70b76690418cce4572b7f6c208d271f323d692a067d59116211a1a - ffi (1.17.2-aarch64-linux-musl) sha256=69e6556b091d45df83e6c3b19d3c54177c206910965155a6ec98de5e893c7b7c - ffi (1.17.2-arm-linux-gnu) sha256=d4a438f2b40224ae42ec72f293b3ebe0ba2159f7d1bd47f8417e6af2f68dbaa5 - ffi (1.17.2-arm-linux-musl) sha256=977dfb7f3a6381206dbda9bc441d9e1f9366bf189a634559c3b7c182c497aaa3 - ffi (1.17.2-arm64-darwin) sha256=54dd9789be1d30157782b8de42d8f887a3c3c345293b57ffb6b45b4d1165f813 - ffi (1.17.2-x86-linux-gnu) sha256=95d8f9ebea23c39888e2ab85a02c98f54acb2f4e79b829250d7267ce741dc7b0 - ffi (1.17.2-x86-linux-musl) sha256=41741449bab2b9530f42a47baa5c26263925306fad0ac2d60887f51af2e3b24c - ffi (1.17.2-x86_64-darwin) sha256=981f2d4e32ea03712beb26e55e972797c2c5a7b0257955d8667ba58f2da6440e - ffi (1.17.2-x86_64-linux-gnu) sha256=05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea - ffi (1.17.2-x86_64-linux-musl) sha256=97c0eb3981414309285a64dc4d466bd149e981c279a56371ef811395d68cb95c + ffi (1.17.3-aarch64-linux-gnu) sha256=28ad573df26560f0aedd8a90c3371279a0b2bd0b4e834b16a2baa10bd7a97068 + ffi (1.17.3-aarch64-linux-musl) sha256=020b33b76775b1abacc3b7d86b287cef3251f66d747092deec592c7f5df764b2 + ffi (1.17.3-arm-linux-gnu) sha256=5bd4cea83b68b5ec0037f99c57d5ce2dd5aa438f35decc5ef68a7d085c785668 + ffi (1.17.3-arm-linux-musl) sha256=0d7626bb96265f9af78afa33e267d71cfef9d9a8eb8f5525344f8da6c7d76053 + ffi (1.17.3-arm64-darwin) sha256=0c690555d4cee17a7f07c04d59df39b2fba74ec440b19da1f685c6579bb0717f + ffi (1.17.3-x86_64-darwin) sha256=1f211811eb5cfaa25998322cdd92ab104bfbd26d1c4c08471599c511f2c00bb5 + ffi (1.17.3-x86_64-linux-gnu) sha256=3746b01f677aae7b16dc1acb7cb3cc17b3e35bdae7676a3f568153fb0e2c887f + ffi (1.17.3-x86_64-linux-musl) sha256=086b221c3a68320b7564066f46fed23449a44f7a1935f1fe5a245bd89d9aea56 flamegraph (0.9.5) sha256=a683020637ffa0e14a72640fa41babf14d926bfeaed87e31907cfd06ab2de8dc fog-aws (3.33.1) sha256=20c7336ed978be6cbf2765844c53f30676288af98f1cb49945aa7b7b45a799a5 fog-core (2.6.0) sha256=3fe08aa83a23cddce42f4ba412040c08f890d7ff04c175c0ee59119371245be6 fog-json (1.2.0) sha256=dd4f5ab362dbc72b687240bba9d2dd841d5dfe888a285797533f85c03ea548fe fog-xml (0.1.5) sha256=52b9fea10701461dd3eaf9d9839702169b418dbbf50426786b9b74fade373bd6 - formatador (1.2.2) sha256=c327370a8d75f61a3228d5e325e67323b64e9f707f44883d701f5ff2d1fff69c - friendly_id (5.5.1) sha256=e018f2b89bfc143276fee6d378a64792385cd4fddd3d4fce501f59ec19c06207 + formatador (1.2.3) sha256=19fa898133c2c26cdbb5d09f6998c1e137ad9427a046663e55adfe18b950d894 + friendly_id (5.6.0) sha256=28e221cd53fbd21586321164c1c6fd0c9ba8dde13969cb2363679f44726bb0c3 front_matter_parser (1.0.1) sha256=bae298bda01db95788a4d6452f1670a3d198c6716c8d3727db9a95533deb7b7b fugit (1.12.1) sha256=5898f478ede9b415f0804e42b8f3fd53f814bd85eebffceebdbc34e1107aaf68 fuubar (2.5.1) sha256=b272a7804b282661c7fab583a3764f92543cb482c365ae39c685cd218fdd4880 @@ -1924,20 +1908,18 @@ CHECKSUMS globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 good_job (4.12.1) sha256=a8a981baf2ac9c40a85412d92ce2bf7a5e6d35d9dadb0900db57780583eafebb google-apis-core (1.0.2) sha256=ba4579aaadc902d6cc7bc8db88f566ab00f5e31ea87ab41e9f9a032c470f2629 - google-apis-gmail_v1 (0.46.0) sha256=9586b8398400e8a49b43728cab94737c102ac95ebe96bde5b52ac229eeea7196 + google-apis-gmail_v1 (0.47.0) sha256=3064434b6da55b85e2828ce4bb0f4d04e8cfd187a4ab262ceb1dcb01f98e49ef google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7 google-logging-utils (0.2.0) sha256=675462b4ea5affa825a3442694ca2d75d0069455a1d0956127207498fca3df7b - google-protobuf (4.32.1) sha256=d9ec3f52a283802055647af5d824dcdfe0a791c6ecbad6a514442f40759015e7 - google-protobuf (4.32.1-aarch64-linux-gnu) sha256=b2254c50085b86a0395b2adea11d9742fe703a135b67689991dcc03a1c9bc179 - google-protobuf (4.32.1-aarch64-linux-musl) sha256=a9cdae8e14ccb781b40efb996ec7ca151fe8521c46cfd40e2b05d62867ab555c - google-protobuf (4.32.1-arm64-darwin) sha256=ef2b6c138847f03af94eeed58ee8aaf00263dd66490ec659202c06dc3b2f0c29 - google-protobuf (4.32.1-x86-linux-gnu) sha256=f8509ecd53e2e494222105a2ebf451ab5ac9f4d014ccd7c8c81699984f3295c2 - google-protobuf (4.32.1-x86-linux-musl) sha256=3214d6025b4e4a995233c6500e38f954dfddffc985bb59d3cfe144d0b965fc00 - google-protobuf (4.32.1-x86_64-darwin) sha256=2e1fe608d8bbd09514258d84e2a281178214473f95f248ab82e0553c5ab6a8a3 - google-protobuf (4.32.1-x86_64-linux-gnu) sha256=2d209c1980dbdeb4114c7d839a3305fb78dc90bde42fb9a22974c8a4841e0263 - google-protobuf (4.32.1-x86_64-linux-musl) sha256=d5314aea8817bd372177205667b4f4442a5884212bcaccb1ba569ec8a1a06ec4 + google-protobuf (4.33.2) sha256=748150d6c642fd655ef39efa23ecf2abe6d616020039a6d1c1764be1da530315 + google-protobuf (4.33.2-aarch64-linux-gnu) sha256=822b2dcb707e94e652cd994642c31035935fca021adfac6164772c511eb7acd4 + google-protobuf (4.33.2-aarch64-linux-musl) sha256=c4b64428183cfd1953ec8c37beec1036668c8ec0865cfb0b18df21181ca397ee + google-protobuf (4.33.2-arm64-darwin) sha256=6d0ac185fed18768e5f16338455b1e4b7c38a97fc46f352e709f7a3007b64e1d + google-protobuf (4.33.2-x86_64-darwin) sha256=87cde586234674562cf099e2b708a65e376e2d39b0f0f48281f4b4ea182b47f8 + google-protobuf (4.33.2-x86_64-linux-gnu) sha256=73cba041477afcac92ff383fcbdec195ea28d96b994876d1deaa944d18f91786 + google-protobuf (4.33.2-x86_64-linux-musl) sha256=97cdf4f772c5540f9274603b00f1474ed5e6e2238b1d8b1585e77f941a36bd2c googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 - googleauth (1.15.1) sha256=d61960893d0d573601d94a38889613b991f40a59ab755b5beed87bf2c3d3cb24 + googleauth (1.16.0) sha256=1e7b5c2ee7edc6a0f5a4a4312c579b3822dc0be2679d6d09ca19d8c7ca5bd5f1 grape (2.4.0) sha256=3d59673e80f11d49ba86270b78344e5348dc057b318c2bbc1c01f3532f9b6aec grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13 gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf @@ -1945,37 +1927,38 @@ CHECKSUMS hana (1.3.7) sha256=5425db42d651fea08859811c29d20446f16af196308162894db208cac5ce9b0d hashdiff (1.2.1) sha256=9c079dbc513dfc8833ab59c0c2d8f230fa28499cc5efb4b8dd276cf931457cd1 hashery (2.1.2) sha256=d239cc2310401903f6b79d458c2bbef5bf74c46f3f974ae9c1061fb74a404862 - hashie (5.0.0) sha256=9d6c4e51f2a36d4616cbc8a322d619a162d8f42815a792596039fc95595603da + hashie (5.1.0) sha256=c266471896f323c446ea8207f8ffac985d2718df0a0ba98651a3057096ca3870 highline (3.1.2) sha256=67cbd34d19f6ef11a7ee1d82ffab5d36dfd5b3be861f450fc1716c7125f4bb4a html-pipeline (2.14.3) sha256=8a1d4d7128b2141913387cac0f8ba898bb6812557001acc0c2b46910f59413a0 htmlbeautifier (1.4.3) sha256=b43d08f7e2aa6ae1b5a6f0607b4ed8954c8d4a8e85fd2336f975dda1e4db385b htmldiff (0.0.1) sha256=a96d068c8b8ea96cca3154a61785365d83129f47f1df964c6b1666924ce113a1 htmlentities (4.3.4) sha256=125a73c6c9f2d1b62100b7c3c401e3624441b663762afa7fe428476435a673da http-2 (1.1.1) sha256=1141a5a03c2f4e6b8d2fa62394de581e1ff6387711cd7ed577212e9d95562bba - http_parser.rb (0.8.0) sha256=5a0932f1fa82ce08a8516a2685d5a86031c000560f89946913c555a0697544be + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a httpx (1.6.3) sha256=1b4a11b9572b78839f649ad6ebbe09b5f467cc458e0ee408bddc902b273a2e8a - i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 i18n-js (4.2.4) sha256=61390d372f8fa68c495c5907d577657e8cc3a7031f4945db1e91f935e1391355 - i18n-tasks (1.1.0) sha256=ebc1e145ca96418307e931f79a60e35e64b8e5f7c3758255c68c1dfad113b068 + i18n-tasks (1.1.2) sha256=4dcfba49e52a623f30661cb316cb80d84fbba5cb8c6d88ef5e02545fffa3637a icalendar (2.12.1) sha256=ecff56c550aed551f29ad1faad0da54bf62362dfaf22a428bd7ad782938fe764 ice_cube (0.17.0) sha256=32deb45dda4b4acc53505c2f581f6d32b5afc04d29b9004769944a0df5a5fcbe ice_nine (0.11.2) sha256=5d506a7d2723d5592dc121b9928e4931742730131f22a1a37649df1c1e2e63db inline_svg (1.10.0) sha256=5b652934236fd9f8adc61f3fd6e208b7ca3282698b19f28659971da84bf9a10f interception (0.5) sha256=a53818d636752a8df90d8c1bb2f7b6e13a7b828543cb02b50fbde98b849d7907 - io-console (0.8.1) sha256=1e15440a6b2f67b6ea496df7c474ed62c860ad11237f29b3bd187f054b925fcb - irb (1.15.3) sha256=4349edff1efa7ff7bfd34cb9df74a133a588ba88c2718098b3b4468b81184aaa + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.16.0) sha256=2abe56c9ac947cdcb2f150572904ba798c1e93c890c256f8429981a7675b0806 iso8601 (0.13.0) sha256=298c2b15b7be5fa95a1372813d36a2257656cd8e906dfbc1f5cb409851425aa2 jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 - json (2.16.0) sha256=ca5630320bb5ca23ebfd0bac84532fab56eb357575653b815b9df42c051e1525 + json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505 json-jwt (1.17.0) sha256=6ff99026b4c54281a9431179f76ceb81faa14772d710ef6169785199caadc4cc json-schema (4.3.1) sha256=d5e68dc32b94408d0b06ad04f9382ccbb6fe5a44910e066f8547f56c471a7825 - json_schemer (2.4.0) sha256=56cb6117bb5748d925b33ad3f415b513d41d25d0bbf57fe63c0a78ff05597c24 + json_rpc_handler (0.1.1) sha256=ea248c8cb4d5490dde320db316ac5e3caf8137a20b5ff9035a4bfc1d19438d90 + json_schemer (2.5.0) sha256=2f01fb4cce721a4e08dd068fc2030cffd0702a7f333f1ea2be6e8991f00ae396 json_spec (1.1.5) sha256=7a77b97a92c787e2aa3fbc4a1239afc3342c781151dc98cfb81461b3b7cad10f jwt (3.1.2) sha256=af6991f19a6bb4060d618d9add7a66f0eeb005ac0bc017cd01f63b42e122d535 ladle (1.0.1) sha256=e8586964108c798d48bf57d2a65bd5602e8e5223a176b6602a0fb36c0bda90dc language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e - lefthook (2.0.4) sha256=edc651f503b4b45cf1c3e24d413027f2ee679de9694a5ccd05337756c3e9f1bd + lefthook (2.0.13) sha256=e6fc347a656b412f72bfc82b4491b9bf5f69937498c4ab1d29cd4bc8c0152912 letter_opener (1.10.0) sha256=2ff33f2e3b5c3c26d1959be54b395c086ca6d44826e8bf41a14ff96fdf1bdbb2 letter_opener_web (3.0.0) sha256=3f391efe0e8b9b24becfab5537dfb17a5cf5eb532038f947daab58cb4b749860 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 @@ -1983,12 +1966,13 @@ CHECKSUMS lobby_boy (0.1.3) sha256=9460bb3c052aef158eb3f137b8f7679ca756b8e2983d140dbdc0caa85c018172 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 lograge (0.14.0) sha256=42371a75823775f166f727639f5ddce73dd149452a55fc94b90c303213dc9ae1 - loofah (2.24.1) sha256=655a30842b70ec476410b347ab1cd2a5b92da46a19044357bbd9f401b009a337 - lookbook (2.3.13) sha256=acfa04a1ba7a87b057c222d78a2d72763546f52549e97590993344c8373f6d21 + loofah (2.25.0) sha256=df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6 + lookbook (2.3.14) sha256=c11a693bde9915b553c4463440ad5e750829f90bff08abdb6b8610373864cd7c mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee - markly (0.14.1) sha256=911970dcf1d077461ab39d46a6e7b68f3e8acbb3a7a9fec41393bad46dceab4f + markly (0.15.2) sha256=65dae965d4dd4ecd997fba43b93acc0fe7dadfec6f07a748640c7a9299a8551e matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + mcp (0.4.0) sha256=4d1dd2b99fbd81a5fdc808d258c38a4f57dd69751ee1e5f62b3ab40e31625a36 md_to_pdf (0.2.5) messagebird-rest (5.0.0) sha256=da4cc1efba3d5e4aa021fad07426c2cb6b326ce5670da5104bb8f6056a39d59c meta-tags (2.22.2) sha256=7fe78af4a92be12091f473cb84a21f6bddbd37f24c4413172df76cd14fff9e83 @@ -1997,33 +1981,31 @@ CHECKSUMS mime-types-data (3.2025.0924) sha256=f276bca15e59f35767cbcf2bc10e023e9200b30bd6a572c1daf7f4cc24994728 mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef - mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289 - minitest (5.26.2) sha256=f021118a6185b9ba9f5af71f2ba103ad770c75afde9f2ab8da512677c550cde3 + minitest (6.0.1) sha256=7854c74f48e2e975969062833adc4013f249a4b212f5e7b9d5c040bf838d54bb msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 - multi_json (1.17.0) sha256=76581f6c96aebf2e85f8a8b9854829e0988f335e8671cd1a56a1036eb75e4a1b + multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7 mustermann (3.0.4) sha256=85fadcb6b3c6493a8b511b42426f904b7f27b282835502233dd154daab13aa22 mustermann-grape (1.1.0) sha256=8d258a986004c8f01ce4c023c0b037c168a9ed889cf5778068ad54398fa458c5 my_page (1.0.0) - net-http (0.8.0) sha256=df42c47ce9f9e95ad32a317c97c12f945bc1af365288837ea4ff259876ecb46d - net-imap (0.5.12) sha256=cb8cd05bd353fcc19b6cbc530a9cb06b577a969ea10b7ddb0f37787f74be4444 + net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996 + net-imap (0.6.2) sha256=08caacad486853c61676cca0c0c47df93db02abc4a8239a8b67eb0981428acc6 net-ldap (0.20.0) sha256=b2080b350753a9ac4930869ded8e61a1d2151c01e03b0bf07b4675cbd9ce5372 net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736 - nio4r (2.7.4) sha256=d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9 - nokogiri (1.18.10) sha256=d5cc0731008aa3b3a87b361203ea3d19b2069628cb55e46ac7d84a0445e69cc1 - nokogiri (1.18.10-aarch64-linux-gnu) sha256=7fb87235d729c74a2be635376d82b1d459230cc17c50300f8e4fcaabc6195344 - nokogiri (1.18.10-aarch64-linux-musl) sha256=7e74e58314297cc8a8f1b533f7212d1999dbe2639a9ee6d97b483ea2acc18944 - nokogiri (1.18.10-arm-linux-gnu) sha256=51f4f25ab5d5ba1012d6b16aad96b840a10b067b93f35af6a55a2c104a7ee322 - nokogiri (1.18.10-arm-linux-musl) sha256=1c6ea754e51cecc85c30ee8ab1e6aa4ce6b6e134d01717e9290e79374a9e00aa - nokogiri (1.18.10-arm64-darwin) sha256=c2b0de30770f50b92c9323fa34a4e1cf5a0af322afcacd239cd66ee1c1b22c85 - nokogiri (1.18.10-x86_64-darwin) sha256=536e74bed6db2b5076769cab5e5f5af0cd1dccbbd75f1b3e1fa69d1f5c2d79e2 - nokogiri (1.18.10-x86_64-linux-gnu) sha256=ff5ba26ba2dbce5c04b9ea200777fd225061d7a3930548806f31db907e500f72 - nokogiri (1.18.10-x86_64-linux-musl) sha256=0651fccf8c2ebbc2475c8b1dfd7ccac3a0a6d09f8a41b72db8c21808cb483385 - oj (3.16.12) sha256=ad9fad6a06dabcf4cfe6a420690a4375377685c16eee0ae88e8d38a43ed7b556 - okcomputer (1.19.0) sha256=8548935a82f725bdd8f2c329925a9f1a1bb2ce19ce26b47d7515665ee363b458 + nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 + nokogiri (1.19.0-aarch64-linux-gnu) sha256=11a97ecc3c0e7e5edcf395720b10860ef493b768f6aa80c539573530bc933767 + nokogiri (1.19.0-aarch64-linux-musl) sha256=eb70507f5e01bc23dad9b8dbec2b36ad0e61d227b42d292835020ff754fb7ba9 + nokogiri (1.19.0-arm-linux-gnu) sha256=572a259026b2c8b7c161fdb6469fa2d0edd2b61cd599db4bbda93289abefbfe5 + nokogiri (1.19.0-arm-linux-musl) sha256=23ed90922f1a38aed555d3de4d058e90850c731c5b756d191b3dc8055948e73c + nokogiri (1.19.0-arm64-darwin) sha256=0811dfd936d5f6dd3f6d32ef790568bf29b2b7bead9ba68866847b33c9cf5810 + nokogiri (1.19.0-x86_64-darwin) sha256=1dad56220b603a8edb9750cd95798bffa2b8dd9dd9aa47f664009ee5b43e3067 + nokogiri (1.19.0-x86_64-linux-gnu) sha256=f482b95c713d60031d48c44ce14562f8d2ce31e3a9e8dd0ccb131e9e5a68b58c + nokogiri (1.19.0-x86_64-linux-musl) sha256=1c4ca6b381622420073ce6043443af1d321e8ed93cc18b08e2666e5bd02ffae4 + oj (3.16.13) sha256=b114bcb83ef884f1736b3112108f77cf9ca90aa8111a775318cc5d7a6a1e0303 + okcomputer (1.19.1) sha256=7df770e768434816d228407f0786563827cbf34cb379933578829720cb4f1e77 omniauth (1.9.2) - omniauth-openid-connect (0.4.2) + omniauth-openid-connect (0.5.0) omniauth-openid_connect-providers (0.2.0) omniauth-saml (1.10.6) sha256=13dde22f4fd1beff0ef2d6dae576f7b68594f159990e8e886d8a02b32397afbd op-clamav-client (3.4.2) sha256=f28d697d11758a2ba3dc530cfdf4871a00ecd517631e8bac30dee30cd6012964 @@ -2046,23 +2028,23 @@ CHECKSUMS openproject-octicons (19.32.0) sha256=e9c908e7c4310d57e1dece8fc506339862f18b67b3b67d549e8f56a7b763d48b openproject-octicons_helper (19.32.0) sha256=687a8b173c6436634397477c1f05b0a575e52745a5cc1aef03351272e73e3832 openproject-openid_connect (1.0.0) - openproject-primer_view_components (0.79.1) sha256=3cb8315ed0ea0cefa831764f9b1c54a4aa242a3bd771626ad2699e62a228519a + openproject-primer_view_components (0.80.2) sha256=d36d9fd48857f3dbcdd0e7a408ef9ce01211a9b09e6186ad2413b300f2e50a8e openproject-recaptcha (1.0.0) openproject-reporting (1.0.0) openproject-storages (1.0.0) openproject-team_planner (1.0.0) - openproject-token (8.3.0) sha256=67fcbc2319e050e4b64ee970477769a8589c5e94ec4be842cdd554ff715db7b7 + openproject-token (8.6.0) sha256=f5865070bd0586f618f476d22544cfa680916e3ff23aea8199a46e31b8a2970e openproject-two_factor_authentication (1.0.0) openproject-webhooks (1.0.0) openproject-xls_export (1.0.0) - openssl (3.3.1) sha256=d6682286baedc205e57928111bafa595d6902b086c1dc7abd88ae20acb1cf837 + openssl (4.0.0) sha256=185711ed93d4e9c9a9db6efea7edb202dfe04f7d3692fbab988e3d84e498ee91 openssl-signature_algorithm (1.3.0) sha256=a3b40b5e8276162d4a6e50c7c97cdaf1446f9b2c3946a6fa2c14628e0c957e80 opentelemetry-api (1.7.0) sha256=ccfd264ea6f2db5bf4185e3c07a1297977b44a944e2ce65457c4fe63a697214f opentelemetry-common (0.23.0) sha256=da721190479d57bae0ad2207468f47f3e2c3b9a91024b5bc32c9d280183eb32c - opentelemetry-exporter-otlp (0.31.0) sha256=eb92fe8c5b0f11f7a1c2c15b0964249c80f3ef852b5c9032f9fe0cf52d1ffb98 + opentelemetry-exporter-otlp (0.31.1) sha256=5358be17d7849cbcc4f49e1fc24105edc780a6f96c8e57b64192ab9a8e47474a opentelemetry-helpers-mysql (0.4.0) sha256=d309c0b20825bdd14d4dbc75e0d3b381ffdad37d16424ceca3cb8453d9cb5a4f opentelemetry-helpers-sql (0.3.0) sha256=4bb08017d6a16dd41c4d1c53c7fd30f9c5bb691195d8b458933724627b3f37f9 - opentelemetry-helpers-sql-obfuscation (0.5.0) sha256=b0a073fb4ac4bf9e3b87ef68db4e5267a3260495c48d0c7682c1d3c3b2baef3f + opentelemetry-helpers-sql-processor (0.3.1) sha256=6041e934bee76c593e971a8bca0979a6ee411723affdd3c11ca1312903bcd9bc opentelemetry-instrumentation-action_mailer (0.6.1) sha256=8384866bdb066ae14b9a1fe686ffaf1f23468326a35af64390c0395fcd471057 opentelemetry-instrumentation-action_pack (0.15.1) sha256=84fade740783caeebf260aaefcbf8f1a7a4c49f946944ff520a2fb1d6b07f273 opentelemetry-instrumentation-action_view (0.11.1) sha256=426134dd7604b77032abe26a49d75d16de32d89af962704c0fdf4ab203e5f599 @@ -2071,7 +2053,7 @@ CHECKSUMS opentelemetry-instrumentation-active_record (0.11.1) sha256=1b083f34eea0449f8d6f4370b3fb4b935757fac6e4e538e67bb98211809e7c92 opentelemetry-instrumentation-active_storage (0.3.1) sha256=f89b0fef54921f17c0c4c38a6e0926d29afabd0ac98436fcdbb8bde85dfde89e opentelemetry-instrumentation-active_support (0.10.1) sha256=82ea98367158797e33c6de96581f10aa4fe8adf0ebec832dcff5fd04c59bc57d - opentelemetry-instrumentation-all (0.87.0) sha256=63a9661a3552d20f19ec7fba69e9fdda632fb5f331fe4a72c275cdaeb721de2a + opentelemetry-instrumentation-all (0.89.1) sha256=6a7de5fd7498024a34eecb63f3d69e8d3e1a3c7933bfef444e1d64e8c2b69f04 opentelemetry-instrumentation-anthropic (0.3.0) sha256=09bd9b4ba6189389a6c0f7ba49f1d11f387d93b411ab585137a48b59925a48de opentelemetry-instrumentation-aws_lambda (0.6.0) sha256=1a3161393cfe9bc9eddd81a0668d076c38a0a2c3d5df40e95d02f5a8fcd3334c opentelemetry-instrumentation-aws_sdk (0.11.0) sha256=67a21e754ddf51e2bb8c3e46e116aa9158d8db800f34c2a9b1e0da5a6ca911e3 @@ -2080,24 +2062,24 @@ CHECKSUMS opentelemetry-instrumentation-concurrent_ruby (0.24.0) sha256=229bd8b72000c59de693609bb637b8a9114992f5e0ab03730d7fd7ef91f7d1d2 opentelemetry-instrumentation-dalli (0.29.0) sha256=a2686650545609e8d7e281c9fd1aef529ab578ef2dcf9a6258737e4ba214bc2f opentelemetry-instrumentation-delayed_job (0.25.1) sha256=47f35b10d2bfd9ac7c2bbbe10dea095a2e25db2a84f5351860ead969d180c3ec - opentelemetry-instrumentation-ethon (0.25.0) sha256=c7b51b89593ec4214cbf11659b815e11423e224b411e9ee310981e7148d23256 - opentelemetry-instrumentation-excon (0.26.0) sha256=cfa146f7aadc9cd6917a0a801832bdcc75374dfec10ad71c673bc1436bb73c07 - opentelemetry-instrumentation-faraday (0.30.0) sha256=015b09dcdb695d4cae540a001565c0caa021852bf986baab218e268935566258 + opentelemetry-instrumentation-ethon (0.26.0) sha256=d4461082c84e8912ab1204340f31cae4aba58b4ae2a854d517b27116750e3752 + opentelemetry-instrumentation-excon (0.26.1) sha256=a856816c98d45ff4cd3ec3b0d7fc1e5e340390f47478f882eb4a688cfc678fef + opentelemetry-instrumentation-faraday (0.30.1) sha256=526822c0575aba333e53bfdb26a4a7b6a30c9cb1b1d400d514d891f4507732f9 opentelemetry-instrumentation-grape (0.5.0) sha256=b9fcbe13b015b663577b8bde5b419c297da2588d0a022f4ce40f9ffc49df7624 opentelemetry-instrumentation-graphql (0.31.2) sha256=a4455f225427f8f9058247c8c0b351b8932567913c35ef049f7958801d401b1f opentelemetry-instrumentation-grpc (0.4.1) sha256=5ffa2bb1d5ec69bcd1fe23e1d8c1a563a00351ce052fe9d76885cc43f21ebc87 opentelemetry-instrumentation-gruf (0.5.0) sha256=ee21be36e312e71b847c9a87168225625890121140a364b68d3668e0df58dacd - opentelemetry-instrumentation-http (0.27.0) sha256=27d70d146d93433a1b34bacbb6dd7b3f51468a568c797621fd8d1c0578cea029 - opentelemetry-instrumentation-http_client (0.26.0) sha256=a8eb182b3e336773daf97cc54d56b4294dce8e0f00de19ea97bed0995405cad5 - opentelemetry-instrumentation-httpx (0.5.0) sha256=713cc0ab1033336fb874d5a68d51cf460823666879d4e3a7a1405d0daed5c125 + opentelemetry-instrumentation-http (0.27.1) sha256=ba70029da6fe9bdfadd31d539823fae3d7fefff11f3487aeeb4cc47b48cf7303 + opentelemetry-instrumentation-http_client (0.26.1) sha256=f6af45487998db43d4b8772b4929d692189b66c5591420220e06c3848012e6ff + opentelemetry-instrumentation-httpx (0.5.1) sha256=3ef926ec56e208290052c8d278e3f82890a7f6dadeb01a7c9a706a3fb4da52dd opentelemetry-instrumentation-koala (0.23.0) sha256=8f324b50a2a64fd4994bb2b105a4cb0c80b64ec05cf5487d2daa906c650bc6f9 opentelemetry-instrumentation-lmdb (0.25.0) sha256=1e4d66d583ea242d4f72051062971f5af1ea353484d224abbd0aabdd1ce5f5cb opentelemetry-instrumentation-mongo (0.25.0) sha256=d04585669f928ea82e7c469f996061d39d8ff184278d57cf4fc77a6d607f9c7a - opentelemetry-instrumentation-mysql2 (0.31.0) sha256=e86fdce4845e2dd7ee00501beb1eecb28626e86c3b0230b9867a4b5f614711fd - opentelemetry-instrumentation-net_http (0.26.0) sha256=4ec1dc3c814e215926323e7eaaac905a661d0bf4236e121ab330e1ec42311d92 - opentelemetry-instrumentation-pg (0.33.0) sha256=26dc3617408de73608aa548754cfe2899e63993231fde307ab9ab0de747d132f - opentelemetry-instrumentation-que (0.11.1) sha256=8c3fb084165481be569760c5b3f194d2af62c4144deed079f993fe0cf9c9f727 - opentelemetry-instrumentation-racecar (0.6.0) sha256=de267a1af9f22b76286ad1830f0ef81b437aad519c230d63f4059e0eb60168cc + opentelemetry-instrumentation-mysql2 (0.32.1) sha256=9f5c705b374f7804d374e4fdb5b793c0321dea25644a006bbb76b2150452277a + opentelemetry-instrumentation-net_http (0.26.1) sha256=354ebf161f2aca0eaafdc9decc014f98b246994308a5de3ccf303f1d4abdfa2c + opentelemetry-instrumentation-pg (0.34.1) sha256=8d6d75f8d895eea040f72ac7765257e82f9aaa81eed44bd1afbcaa7f49ebb5c2 + opentelemetry-instrumentation-que (0.12.0) sha256=3b7a84341f6af5a04f8c57860aeba4033f87c855d40c611a2fc40dde849944fb + opentelemetry-instrumentation-racecar (0.6.1) sha256=833f6611906fb661f577e841d4ec52549474d32b4e8edea8048162348d35b845 opentelemetry-instrumentation-rack (0.29.0) sha256=9e2cbb8336087064cbe33b502d917d85b174162bc717efda1cfdbd182342f377 opentelemetry-instrumentation-rails (0.39.1) sha256=7959df7895543040fbb5cd3877c37bc9f95d79ff9d7749334314c50b871ac96f opentelemetry-instrumentation-rake (0.5.0) sha256=fa6bd019078975ac8a67eaea06294e4fe6707e6770d8ced88d74dc573b0a01ef @@ -2106,9 +2088,9 @@ CHECKSUMS opentelemetry-instrumentation-resque (0.8.0) sha256=559edde9d6273dd757ae5149ed36e26d147b63028d084121203f51c8cff805e5 opentelemetry-instrumentation-restclient (0.26.0) sha256=5d4e9d93ef51564a1023c076e17b4ac3b42fe81003321d9fb66e44886538bdce opentelemetry-instrumentation-ruby_kafka (0.24.0) sha256=257e891f4ce630ba3e0669408d497b44afcc493cd49aed09343d5a51fa8952c2 - opentelemetry-instrumentation-sidekiq (0.28.0) sha256=748d651c49740f261caf2da33d0a665b97442bf1caec4e35757a1b430353226e + opentelemetry-instrumentation-sidekiq (0.28.1) sha256=abc85d62996a5362e7a9fd7af9f6c709d01ce04795514d12fee5126335ae97ae opentelemetry-instrumentation-sinatra (0.28.0) sha256=9f11d68c580a421cadd633aca1f8f92707d6b6995d48fffa045a48c187347f26 - opentelemetry-instrumentation-trilogy (0.64.0) sha256=a2aa19f727e86e57ee9799a2fd2c0fe9fd5b2eff69f16b30cde11d7748309fc5 + opentelemetry-instrumentation-trilogy (0.65.1) sha256=4e20ef2aee15613ea9e5468c1561184fc94cde615f3174c6f5d80c76fea8ccbd opentelemetry-registry (0.4.0) sha256=903fa6bfaa29eac1c1d73a4fdd29b850977b5353b84b8cdff11222c00ad2968f opentelemetry-sdk (1.10.0) sha256=43719949be8df24dcaeb86ebbf75636cda87d51a01af2729499b92a48b80521a opentelemetry-semantic_conventions (1.36.0) sha256=c1b1607dbc7853aac7f9e23f6e8b76969c45b07f2b812a4aa4383c19a3b0f617 @@ -2117,40 +2099,40 @@ CHECKSUMS ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 overviews (1.0.0) ox (2.14.23) sha256=4a9aedb4d6c78c5ebac1d7287dc7cc6808e14a8831d7adb727438f6a1b461b66 - pagy (43.1.5) sha256=b4b8a12a6edd6d66fa8501989903238a5f767605ca306a90745c82b00f8cb543 + pagy (43.2.2) sha256=8fe4b1838377617b81a6f0ca00c7658907f7c6fa95f943cbe1ce8424f79cf122 paper_trail (17.0.0) sha256=1c2842061d3874ca7015908e821e2aa14f9b982af2acb2a7974713bf79021c85 parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 parallel_tests (4.10.1) sha256=df05458c691462b210f7a41fc2651d4e4e8a881e8190e6d1e122c92c07735d70 parser (3.3.10.0) sha256=ce3587fa5cc55a88c4ba5b2b37621b3329aadf5728f9eafa36bbd121462aabd6 pdf-core (0.9.0) sha256=4f368b2f12b57ec979872d4bf4bd1a67e8648e0c81ab89801431d2fc89f4e0bb pdf-inspector (1.3.0) sha256=fc107579d6f29b636e2da3d6743479b2624d9e390bf2d84beef8fd4ebe1a05bd - pdf-reader (2.15.0) sha256=c5025750bec8de7b11cfd1d1ccc2b944d2782c3638cd15b5ee1531d1206c0886 - pg (1.6.2) sha256=58614afd405cc9c2c9e15bffe8432e0d6cfc58b722344ad4a47c73a85189c875 - pg (1.6.2-aarch64-linux) sha256=0503c6be5b0ca5ca3aaf91f2ed638f90843313cb81e8e7d7b60ad4bb62c3d131 - pg (1.6.2-aarch64-linux-musl) sha256=c4402447c56279bea80472770522e95c8a2ff49b7f3e534d0cdb01eb27fd6eb8 - pg (1.6.2-arm64-darwin) sha256=4d44500b28d5193b26674583d199a6484f80f1f2ea9cf54f7d7d06a1b7e316b6 - pg (1.6.2-x86_64-darwin) sha256=c441a55723584e2ae41749bf26024d7ffdfe1841b442308ed50cd6b7fda04115 - pg (1.6.2-x86_64-linux) sha256=525f438137f2d1411a1ebcc4208ec35cb526b5a3b285a629355c73208506a8ea - pg (1.6.2-x86_64-linux-musl) sha256=e5c8668ffeaf7a9c3458a3dcb002dffa6d8ee1fca9ae534ffef861d2b15644ca - plaintext (0.3.6) sha256=6ae13dce9f94e26bde4069109455a1d4948ae161e89350db1a9b37667b61f385 + pdf-reader (2.15.1) sha256=18c6a986a84a3117fa49f4279fc2de51f5d2399b71833df5d2bccd595c7068ce + pg (1.6.3) sha256=1388d0563e13d2758c1089e35e973a3249e955c659592d10e5b77c468f628a99 + pg (1.6.3-aarch64-linux) sha256=0698ad563e02383c27510b76bf7d4cd2de19cd1d16a5013f375dd473e4be72ea + pg (1.6.3-aarch64-linux-musl) sha256=06a75f4ea04b05140146f2a10550b8e0d9f006a79cdaf8b5b130cde40e3ecc2c + pg (1.6.3-arm64-darwin) sha256=7240330b572e6355d7c75a7de535edb5dfcbd6295d9c7777df4d9dddfb8c0e5f + pg (1.6.3-x86_64-darwin) sha256=ee2e04a17c0627225054ffeb43e31a95be9d7e93abda2737ea3ce4a62f2729d6 + pg (1.6.3-x86_64-linux) sha256=5d9e188c8f7a0295d162b7b88a768d8452a899977d44f3274d1946d67920ae8d + pg (1.6.3-x86_64-linux-musl) sha256=9c9c90d98c72f78eb04c0f55e9618fe55d1512128e411035fe229ff427864009 + plaintext (0.3.7) sha256=3b923152ee84d98898d459e9442ec9cca84d2acdbb8d232e2bcf41c5723e70d5 pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 prawn (2.4.0) sha256=82062744f7126c2d77501da253a154271790254dfa8c309b8e52e79bc5de2abd prawn-table (0.2.2) sha256=336d46e39e003f77bf973337a958af6a68300b941c85cb22288872dc2b36addb prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 - prism (1.6.0) sha256=bfc0281a81718c4872346bc858dc84abd3a60cae78336c65ad35c8fbff641c6b - prometheus-client-mmap (1.2.10) sha256=46d4ce67a05cd77910ebe9a64682206fd1c8f5fd2e4da7373713e16dc43e1444 - prometheus-client-mmap (1.2.10-aarch64-linux-gnu) sha256=a014e7748ba72928e58538f155b18479ce315396e9c7ab2115a80ea0a86001ac - prometheus-client-mmap (1.2.10-aarch64-linux-musl) sha256=ba6c4b091c8a249b207ed7e482bcf58095b2631d29c3e51a463ab7f6cc01b8bd - prometheus-client-mmap (1.2.10-arm64-darwin) sha256=1c9956cd3db419330b5797cb7e0ab4a1684351d82da38c14291be39d067d62d7 - prometheus-client-mmap (1.2.10-x86_64-darwin) sha256=4ca9c299079fe9e52a27cf34095357e2547c8cae9741728ffa502c814f61512e - prometheus-client-mmap (1.2.10-x86_64-linux-gnu) sha256=6eee9f81a5a34829bbbca20ccd75597af4a2538f1109d1efebee9a3c8b40390e - prometheus-client-mmap (1.2.10-x86_64-linux-musl) sha256=a47e54d4c28196806b49f00ef9182da42812269d1ebd3e9bb4cb1ca8d68300da + prism (1.8.0) sha256=84453a16ef5530ea62c5f03ec16b52a459575ad4e7b9c2b360fd8ce2c39c1254 + prometheus-client-mmap (1.5.0) sha256=361eb98d6c19ae0f44ae5e02f9e6750436fd92d1c501d1c69843609c1daf0117 + prometheus-client-mmap (1.5.0-aarch64-linux-gnu) sha256=e7fe1a630dda83a237efb0eb4a29ee3da37922722fc89ecac6057a1187372c5d + prometheus-client-mmap (1.5.0-aarch64-linux-musl) sha256=897fa5d82150ddcb3bc30dfa7af0deb85930655500e71bd8879daa86b5e690ff + prometheus-client-mmap (1.5.0-arm64-darwin) sha256=78703435f76d246e31a04344071630133608a4e624275a910cfb2c19346b5aa3 + prometheus-client-mmap (1.5.0-x86_64-darwin) sha256=96d360bbffc5603f8322a0b8c3353cf531c06410cf80dbdeda46efbd27a6a5a2 + prometheus-client-mmap (1.5.0-x86_64-linux-gnu) sha256=2f5e7be72ea0b8bddd0e6a123e8f2468d7e2bdfa664a4d355fec4ed4f659d457 + prometheus-client-mmap (1.5.0-x86_64-linux-musl) sha256=4673196ca44feb6db5eb63d5248feea32ffaae851f7861eee25218ccf7057ef4 pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b pry-byebug (3.11.0) sha256=0b0abb7d309bc7f00044d512a3c8567274f7012b944b38becc8440439a1cea72 pry-rails (0.3.11) sha256=a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d pry-rescue (1.6.0) sha256=985bfd506d9866b587fd86790cf8445266a41b7f92c627fc5b21ec7d92aba6db - psych (5.2.6) sha256=814328aa5dcb6d604d32126a20bc1cbcf05521a5b49dbb1a8b30a07e580f316e - public_suffix (6.0.2) sha256=bfa7cd5108066f8c9602e0d6d4114999a5df5839a63149d3e8b0f9c1d3558394 + psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + public_suffix (7.0.2) sha256=9114090c8e4e7135c1fd0e7acfea33afaab38101884320c65aaa0ffb8e26a857 puffing-billy (4.0.2) sha256=c983610f737e3847301f64cf41dccd9dcedcac9219af54d6eaf8178cbe48b3cc puma (7.1.0) sha256=e45c10cb124f224d448c98db653a75499794edbecadc440ad616cf50f2fd49dd puma-plugin-statsd (2.7.0) sha256=04f243a7233f4d06ec0e26f1a3522bce18a5910ae711763fabff22681bdad08b @@ -2160,7 +2142,7 @@ CHECKSUMS rack-attack (6.8.0) sha256=f2499fdebf85bcc05573a22dff57d24305ac14ec2e4156cd3c28d47cafeeecf2 rack-cors (2.0.2) sha256=415d4e1599891760c5dc9ef0349c7fecdf94f7c6a03e75b2e7c2b54b82adda1b rack-mini-profiler (4.0.1) sha256=485810c23211f908196c896ea10cad72ed68780ee2998bec1f1dfd7558263d78 - rack-oauth2 (2.2.1) sha256=c73aa87c508043e2258f02b4fb110cacba9b37d2ccf884e22487d014a120d1a5 + rack-oauth2 (2.3.0) sha256=43e02cf73f13886a0a06499603caeec58aeba6eae1fefc4977c9678b7652c632 rack-protection (3.2.0) sha256=3c74ba7fc59066453d61af9bcba5b6fe7a9b3dab6f445418d3b391d5ea8efbff rack-session (1.0.2) sha256=a02115e5420b4de036839b9811e3f7967d73446a554b42aa45106af335851d76 rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463 @@ -2171,21 +2153,21 @@ CHECKSUMS rails-controller-testing (1.0.5) sha256=741448db59366073e86fc965ba403f881c636b79a2c39a48d0486f2607182e94 rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d rails-html-sanitizer (1.6.2) sha256=35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560 - rails-i18n (8.0.2) sha256=624f31f652f85fd28024a521fea786223c4653cc83a468fbe3d410cb40f738af + rails-i18n (8.1.0) sha256=52d5fd6c0abef28d84223cc05647f6ae0fd552637a1ede92deee9545755b6cf3 railties (8.0.4) sha256=8203d853dcffab4abcdd05c193f101676a92068075464694790f6d8f72d5cb47 rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c - rake-compiler-dock (1.9.1) sha256=e73720a29aba9c114728ce39cc0d8eef69ba61d88e7978c57bac171724cd4d53 + rake-compiler-dock (1.11.0) sha256=eab51f2cd533eb35cea6b624a75281f047123e70a64c58b607471bb49428f8c2 rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e - rb_sys (0.9.117) sha256=755feaf6c640baceca7a9362dfb0ae87ff4ff16e3566d9ef86533896eb85cb59 - rbtrace (0.5.2) sha256=a2d7d222ab81363aaa0e91337ddbf70df834885d401a80ea0339d86c71f31895 + rb_sys (0.9.124) sha256=513476557b12eaf73764b3da9f8746024558fe8699bda785fb548c9aa3877ae7 + rbtrace (0.5.3) sha256=c432292f305d9ab12fd47d9722e0d5210d983758a951fe6107c36cc955cb923f rbtree3 (0.7.1) sha256=ab60ead728a5491b70df4f4065e180b18dbab5319f817ce1dbf5dd906f26d8ba - rdoc (6.15.1) sha256=28bfac73cd8b226a8079f53a564ceaccdb5b4480e34335100001570ddb1a481a + rdoc (7.1.0) sha256=494899df0706c178596ca6e1d50f1b7eb285a9b2aae715be5abd742734f17363 recaptcha (5.21.1) sha256=e003e9ceba9b993a9f0c6a828c192f2d46693cd2aa0b0beae94f936649507adb redcarpet (3.6.1) sha256=d444910e6aa55480c6bcdc0cdb057626e8a32c054c29e793fa642ba2f155f445 redis (5.4.1) sha256=b5e675b57ad22b15c9bcc765d5ac26f60b675408af916d31527af9bd5a81faae - redis-client (0.25.2) sha256=aa37e34c29da39fdb0b8663e7a649adb0923959cd4a9351befe2cd19e6f8d6f0 + redis-client (0.26.2) sha256=1336fb5a7202d398b719531853c184b7c9cbdcace1f00f8356062b9dfba6779b regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4 reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace @@ -2196,22 +2178,22 @@ CHECKSUMS rinku (2.0.6) sha256=8b60670e3143f3db2b37efa262971ce3619ec23092045498ef9f077d82828d7d roar (1.2.0) sha256=8db4d1ca79c57a5fb746c16c0d5661d7c3e0de3d9553dc016a88d2dba2929d08 rotp (6.3.0) sha256=75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854 - rouge (4.6.1) sha256=5075346d5797d6864be93f7adc75a16047a7dbfa572c63c502419ffa582c77de + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587 rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836 - rspec-mocks (3.13.6) sha256=78b137ae5e91c5072bf81d40d78189aa911e965a81adc245e2d8d9ba624d9b4e + rspec-mocks (3.13.7) sha256=0979034e64b1d7a838aaaddf12bf065ea4dc40ef3d4c39f01f93ae2c66c62b1c rspec-rails (8.0.2) sha256=113139a53f5d068d4f48d1c29ad5f982013ed9b0daa69d7f7b266eda5d433ace rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858 rspec-support (3.13.6) sha256=2e8de3702427eab064c9352fe74488cc12a1bfae887ad8b91cba480ec9f8afb2 rspec-wait (1.0.2) sha256=865f921239325d3d26fc10ded4bdd485d8b58bcaaad1a28dd85ed15266b5a912 - rubocop (1.81.7) sha256=6fb5cc298c731691e2a414fe0041a13eb1beed7bab23aec131da1bcc527af094 - rubocop-ast (1.48.0) sha256=22df9bbf3f7a6eccde0fad54e68547ae1e2a704bf8719e7c83813a99c05d2e76 + rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273 + rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-openproject (0.3.0) sha256=9554496e7ef0a2cf65dc2b32bee1bfa223b4f9ae058a5c603489d34e9001a828 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 - rubocop-rails (2.33.3) sha256=848c011b58c1292f3066246c9eb18abf6ffcfbce28bc57c4ab888bbec79af74b + rubocop-rails (2.34.3) sha256=10d37989024865ecda8199f311f3faca990143fbac967de943f88aca11eb9ad2 rubocop-rspec (3.8.0) sha256=28440dccb3f223a9938ca1f946bd3438275b8c6c156dab909e2cb8bc424cab33 rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 ruby-duration (3.2.3) sha256=eb3d13b1df85067a015a8fb2ed8f1eec842a3b721e47c9b6fd74d2f356069784 @@ -2226,10 +2208,10 @@ CHECKSUMS rubyzip (2.4.1) sha256=8577c88edc1fde8935eb91064c5cb1aef9ad5494b940cf19c775ee833e075615 safety_net_attestation (0.5.0) sha256=c8cd01dd550dbe8553862918af6355a04672db11d218ec96104ce3955293f2aa sanitize (7.0.0) sha256=269d1b9d7326e69307723af5643ec032ff86ad616e72a3b36d301ac75a273984 - scimitar (2.13.0) sha256=8437fe62075130c83680d33e953eaf5dd441d4dfef67090f1d3b9e1c3d462e38 + scimitar (2.14.0) sha256=93b29132ebd50d78e61d56c8a17406b1c01857448f2d075560fd6c7660ac9aa9 securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 - selenium-devtools (0.142.0) sha256=96008ebac9091dd76b67a20a07d2d8b6dc9254daba65decc1b94bfb910548c9f - selenium-webdriver (4.38.0) sha256=0a84e71fef66394ae8d9290d3a5bc24b33de49d45a7aa57fc09f246218bf102f + selenium-devtools (0.143.0) sha256=23e8b364e1074a93a56ea0365ff739022a23a72e9033ad69832400c884417dc4 + selenium-webdriver (4.39.0) sha256=984a1e63d39472eaf286bac3c6f1822fa7eea6eed9c07a66ce7b3bc5417ba826 semantic (1.6.1) sha256=3cdbb48f59198ebb782a3fdfb87b559e0822a311610db153bae22777a7d0c163 shoulda-context (2.0.0) sha256=7adf45342cd800f507d2a053658cb1cce2884b616b26004d39684b912ea32c34 shoulda-matchers (7.0.1) sha256=b4bfd8744c10e0a36c8ac1a687f921ee7e25ed529e50488d61b79a8688749c77 @@ -2246,11 +2228,11 @@ CHECKSUMS stackprof (0.2.27) sha256=aff6d28656c852e74cf632cc2046f849033dc1dedffe7cb8c030d61b5745e80c store_attribute (2.0.1) sha256=643655e4800655b58379e8b01bd524f5586093a9d88698483ac8762cda25b5ab stringex (2.8.6) sha256=c7b382d2b2a47a1e1646f256df201c48d487d6296fbb289d76802f67f5e929c4 - stringio (3.1.8) sha256=99c43c3a9302843cca223fd985bfc503dd50a4b1723d3e4a9eb1d9c37d99e4ec + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 structured_warnings (0.5.0) sha256=864aca5a4d6b63cd3a948f9dcd7f5498af1cf42bcf4fd75e2c315b7d77a30583 svg-graph (2.2.2) sha256=f928866403055e6539afdfdab5f6268d108b2abc9f002e0fc51b16511809513a swd (2.0.3) sha256=4cdbe2a4246c19f093fce22e967ec3ebdd4657d37673672e621bf0c7eb770655 - sys-filesystem (1.5.4) sha256=a6101674a4d0e641b0f628753439091134e080ed84a3e794570aa2fb07872b45 + sys-filesystem (1.5.5) sha256=6f995890a734b9f0aa55df5e09d99adeb9fd1c288f2c4097269a1f8c95e15033 table_print (1.5.7) sha256=436664281f93387b882335795e16cfeeb839ad0c785ff7f9110fc0f17c68b5cb terminal-table (4.0.0) sha256=f504793203f8251b2ea7c7068333053f0beeea26093ec9962e62ea79f94301d2 test-prof (1.4.4) sha256=1a59513ed9d33a1f5ca17c0b89da4e70f60a91c83ec62e9a873dbb99141353ef @@ -2258,7 +2240,7 @@ CHECKSUMS thor (1.4.0) sha256=8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d thread_safe (0.3.6) sha256=9ed7072821b51c57e8d6b7011a8e282e25aeea3a4065eab326e43f66f063b05a timecop (0.9.10) sha256=12ba45ce57cdcf6b1043cb6cdffa6381fd89ce10d369c28a7f6f04dc1b0cd8eb - timeout (0.4.4) sha256=f0f6f970104b82427cd990680f539b6bbb8b1e55efa913a55c6492935e4e0edb + timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af tpm-key_attestation (0.14.1) sha256=7fd4e4653a7afd0a386632ddfb05d10ecfdd47678299c5e69165bc9ae111193f trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f @@ -2267,24 +2249,24 @@ CHECKSUMS turbo_power (0.7.0) sha256=ad95d147e0fa761d0023ad9ca00528c7b7ddf6bba8ca2e23755d5b21b290d967 turbo_tests (2.2.0) tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b - tzinfo-data (1.2025.2) sha256=a92375a1fbb47d38fe88fd514c40a38cc8f97d168da2a6479f15185e86470939 + tzinfo-data (1.2025.3) sha256=b546e2f1e5e5c40a0c619aafb24e30d3d6a128c2f689278f721b7286dd499562 uber (0.1.0) sha256=5beeb407ff807b5db994f82fa9ee07cfceaa561dad8af20be880bc67eba935dc unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 - unicode-emoji (4.1.0) sha256=4997d2d5df1ed4252f4830a9b6e86f932e2013fbff2182a9ce9ccabda4f325a5 + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844 validate_email (0.1.6) sha256=9dfe9016d527b17a8d3a6e95e4dc50a125400eef899d13d4cc2a254393f82ee4 validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451 - vcr (6.3.1) sha256=37b56e157e720446a3f4d2d39919cabef8cb7b6c45936acffd2ef8229fec03ed - vernier (1.8.1) sha256=317ff657dca28195e934ced93b78f02c46b652878231882f47e5ef330d584f2c - view_component (4.1.1) sha256=179f63b0db1d1a8f6af635dd684456b2bcdf6b6f4da2ef276bbe0579c17b377e + vcr (6.4.0) sha256=077ac92cc16efc5904eb90492a18153b5e6ca5398046d8a249a7c96a9ea24ae6 + vernier (1.9.0) sha256=3aa6169804144ef27744123525f8f884541185a2eeb53c77afb28ad33c4be3cd + view_component (4.2.0) sha256=f250a3397a794336354f73c229b3b7549af0b24906551b99a03492b54cb5233d virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2 warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0 warden-basic_auth (0.2.1) sha256=bfc752e0109c0182c3e69e930284c5e1e81e7b4a354aeb2b5914ead1391f3c6e webauthn (3.4.3) sha256=9be6f5f838f3405b0226e560aa40b67cc8c15ec9154509b997caa7ec9a05e1fc webfinger (2.1.3) sha256=567a52bde77fb38ca6b67e55db755f988766ec4651c1d24916a65aa70540695c webmock (3.26.1) sha256=4f696fb57c90a827c20aadb2d4f9058bbff10f7f043bd0d4c3f58791143b1cd7 - webrick (1.9.1) sha256=b42d3c94f166f3fb73d87e9b359def9b5836c426fc8beacf38f2184a21b2a989 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737 websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962 websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241 @@ -2294,11 +2276,11 @@ CHECKSUMS yabeda (0.14.0) sha256=bc517bf22d692ebd80a29fc9fd2246c257aaf92d10b2735a775e2419351a43bf yabeda-activerecord (0.1.2) sha256=1dd281a64e5742445a6718aa05e799ea08a397e9ab9c0d254ece447635a3e0e2 yabeda-prometheus-mmap (0.4.0) sha256=1a66120756d6f931f03a7784e08e79060d71681ff83a9f5287df2ff756e9e2c9 - yabeda-puma-plugin (0.8.0) sha256=91ec807106058551860260a638d1de21fbf22ce5c12847b08401840e68092c86 - yabeda-rails (0.10.0) sha256=0a85bd829961494f66241d20192368e5d042f836f91986a1eac02f8dcb04237c + yabeda-puma-plugin (0.9.0) sha256=b78673ecc7ee30bc50691ddc41b7022c1c1801843900d5101418f4a14b550bc8 + yabeda-rails (0.11.0) sha256=afa2581bd44c8f419cb3f2bbf9f6fb40f817c30476f7caf5d1c55c48d69a5b29 yaml (0.4.0) sha256=240e69d1e6ce3584d6085978719a0faa6218ae426e034d8f9b02fb54d3471942 - yard (0.9.37) sha256=a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992 - zeitwerk (2.7.3) sha256=b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85 + yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f + zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b RUBY VERSION ruby 3.4.7p58 diff --git a/Gemfile.modules b/Gemfile.modules index 67b6e29ac5b..bf1f2f7b5b9 100644 --- a/Gemfile.modules +++ b/Gemfile.modules @@ -8,7 +8,7 @@ gem 'omniauth-openid_connect-providers', gem 'omniauth-openid-connect', git: 'https://github.com/opf/omniauth-openid-connect.git', - ref: 'f0c1ecdb26e39017a9e929af75a166c772d960bb' + ref: '825d06235b64f6bc872bba709f1c2d48fd5cede4' group :opf_plugins do # included so that engines can reference OpenProject::Version diff --git a/app/assets/images/17_0_features.png b/app/assets/images/17_0_features.png deleted file mode 100644 index fbf8148b881..00000000000 Binary files a/app/assets/images/17_0_features.png and /dev/null differ diff --git a/app/assets/images/17_1_features.png b/app/assets/images/17_1_features.png new file mode 100644 index 00000000000..cedeb0a5c75 Binary files /dev/null and b/app/assets/images/17_1_features.png differ diff --git a/app/assets/images/enterprise/project-creation-wizard.png b/app/assets/images/enterprise/project-creation-wizard.png new file mode 100644 index 00000000000..19eb4295186 Binary files /dev/null and b/app/assets/images/enterprise/project-creation-wizard.png differ diff --git a/app/assets/images/lookbook/advanced_form_inputs/installation_alerts.svg b/app/assets/images/lookbook/advanced_form_inputs/installation_alerts.svg new file mode 100644 index 00000000000..42d3862c4a4 --- /dev/null +++ b/app/assets/images/lookbook/advanced_form_inputs/installation_alerts.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/assets/images/lookbook/check_all_component.png b/app/assets/images/lookbook/check_all_component.png new file mode 100644 index 00000000000..0a624fe7cba Binary files /dev/null and b/app/assets/images/lookbook/check_all_component.png differ diff --git a/app/components/_index.sass b/app/components/_index.sass index 373e94a930e..9265c6cbe8c 100644 --- a/app/components/_index.sass +++ b/app/components/_index.sass @@ -1,6 +1,7 @@ @import "enterprise_edition/banner_component" @import "filter/filters_component" @import "op_primer/border_box_table_component" +@import "op_primer/full_page_prompt_component" @import "op_primer/form_helpers" @import "open_project/common/attribute_component" @import "open_project/common/attribute_help_text_component" diff --git a/app/components/admin/custom_fields/hierarchy/change_item_parent_dialog_component.html.erb b/app/components/admin/custom_fields/hierarchy/change_item_parent_dialog_component.html.erb index ce4d8393fb1..5051f539aa6 100644 --- a/app/components/admin/custom_fields/hierarchy/change_item_parent_dialog_component.html.erb +++ b/app/components/admin/custom_fields/hierarchy/change_item_parent_dialog_component.html.erb @@ -46,12 +46,15 @@ See COPYRIGHT and LICENSE files for more details. ) do |tree_view| parent = @hierarchy_item.parent descendants = hierarchy_service.get_descendants(item: @hierarchy_item).value! + item_formatter = standard_tree_view_item_formatter + label_fn = lambda { |item| item_formatter.format(item:) } item_options = { select_variant: :single, expanded: [parent], current: @hierarchy_item, - disabled: [parent] + descendants + disabled: [parent] + descendants, + label_fn: } populate_tree_view(tree_view, @custom_field, show_root: true, item_options:) diff --git a/app/components/admin/custom_fields/hierarchy/item_component.html.erb b/app/components/admin/custom_fields/hierarchy/item_component.html.erb index e20df28f7ce..30938cd9c6f 100644 --- a/app/components/admin/custom_fields/hierarchy/item_component.html.erb +++ b/app/components/admin/custom_fields/hierarchy/item_component.html.erb @@ -49,6 +49,7 @@ See COPYRIGHT and LICENSE files for more details. end end + label_addition = secondary_text if label_addition.present? item_information.with_column(mr: 2) do render(Primer::Beta::Text.new(color: :subtle)) { label_addition } diff --git a/app/components/admin/custom_fields/hierarchy/item_component.rb b/app/components/admin/custom_fields/hierarchy/item_component.rb index 3610985bfaa..908c84c3502 100644 --- a/app/components/admin/custom_fields/hierarchy/item_component.rb +++ b/app/components/admin/custom_fields/hierarchy/item_component.rb @@ -55,6 +55,15 @@ module Admin self.class.menu_id(item: model) end + def secondary_text + ::CustomFields::Hierarchy::HierarchicalItemFormatter + .new(label: false, + number_length_limit: 42, + number_integer_digit_limit: 40, + number_precision: 40) + .format(item: model) + end + def item_link if project_custom_field_context? admin_settings_project_custom_field_item_path(custom_field_id, model) diff --git a/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb b/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb index 5883f7c7218..148ad777637 100644 --- a/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb +++ b/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb @@ -30,10 +30,12 @@ See COPYRIGHT and LICENSE files for more details. <%= render(Primer::Alpha::TreeView.new(node_variant: :anchor)) do |tree_view| + item_formatter = standard_tree_view_item_formatter item_options = { href_fn: lambda { |item| href_for(item) }, expanded: [@active_item, @active_item.parent], - current: @active_item + current: @active_item, + label_fn: lambda { |item| item_formatter.format(item:) } } populate_tree_view(tree_view, @custom_field, item_options:) diff --git a/app/components/admin/enumerations/index_component.rb b/app/components/admin/enumerations/index_component.rb index a5054829662..2c597ea931a 100644 --- a/app/components/admin/enumerations/index_component.rb +++ b/app/components/admin/enumerations/index_component.rb @@ -51,8 +51,8 @@ module Admin def drop_target_config { - "is-drag-and-drop-target": true, - "target-container-accessor": "& > ul", + generic_drag_and_drop_target: "container", + "target-container-accessor": ":scope > ul", "target-allowed-drag-type": "enumeration" } end diff --git a/app/components/admin/enumerations/item_component.html.erb b/app/components/admin/enumerations/item_component.html.erb index 6f7430ec614..e3179351c7f 100644 --- a/app/components/admin/enumerations/item_component.html.erb +++ b/app/components/admin/enumerations/item_component.html.erb @@ -3,7 +3,7 @@ flex_layout(align_items: :center, justify_content: :space_between) do |enumeration_container| enumeration_container.with_column(flex_layout: true) do |enumeration_info| enumeration_info.with_column(mr: 2) do - render(Primer::OpenProject::DragHandle.new(draggable: true)) + render(Primer::OpenProject::DragHandle.new) end if colored? diff --git a/app/components/concerns/work_packages/activities_tab/stimulus_controllers.rb b/app/components/concerns/work_packages/activities_tab/stimulus_controllers.rb index 71c08776643..5271da79327 100644 --- a/app/components/concerns/work_packages/activities_tab/stimulus_controllers.rb +++ b/app/components/concerns/work_packages/activities_tab/stimulus_controllers.rb @@ -43,11 +43,11 @@ module WorkPackages def quote_comments_stimulus_controller(suffix = nil) = "#{stimulus_controller_namespace}--quote-comment#{suffix}" def index_component_dom_selector - "##{WorkPackages::ActivitiesTab::IndexComponent.index_content_wrapper_key}" + "##{WorkPackages::ActivitiesTab::LazyIndexComponent.index_content_wrapper_key}" end def add_comment_component_dom_selector - "##{WorkPackages::ActivitiesTab::IndexComponent.add_comment_wrapper_key}" + "##{WorkPackages::ActivitiesTab::LazyIndexComponent.add_comment_wrapper_key}" end def stimulus_controller_namespace = "work-packages--activities-tab" diff --git a/app/components/enterprise_edition/upsell_buttons_component.rb b/app/components/enterprise_edition/upsell_buttons_component.rb index 803cfa4e9c5..eb2802497ab 100644 --- a/app/components/enterprise_edition/upsell_buttons_component.rb +++ b/app/components/enterprise_edition/upsell_buttons_component.rb @@ -103,21 +103,14 @@ module EnterpriseEdition def more_info_button return if @feature_key == :teaser - render(Primer::Beta::Link.new(href: enterprise_link, target: "_blank")) do |link| - link.with_trailing_visual_icon(icon: "link-external") - link_title - end + fallback_link = OpenProject::Static::Links.url_for(:enterprise_features, :default) + helpers.static_link_to(:enterprise_features, feature_key, + href: fallback_link, + label: link_title) end def link_title I18n.t("ee.upsell.#{feature_key}.link_title", default: I18n.t(:label_more_information)) end - - def enterprise_link - href_value = OpenProject::Static::Links.url_for(:enterprise_features, feature_key) - default_value = OpenProject::Static::Links.url_for(:enterprise_features, :default) - - href_value || default_value - end end end diff --git a/app/components/filter/filter_component.rb b/app/components/filter/filter_component.rb index 1a07217fd0b..4b18dfea7c0 100644 --- a/app/components/filter/filter_component.rb +++ b/app/components/filter/filter_component.rb @@ -168,7 +168,6 @@ module Filter resource: "principals", url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals, filters: [ - { name: "type", operator: "=", values: ["User"] }, { name: "status", operator: "!", values: [Principal.statuses["locked"].to_s] } ], searchKey: "any_name_attribute", diff --git a/app/components/homescreen/blocks/community.html.erb b/app/components/homescreen/blocks/community.html.erb index 7613ce53859..4c6cd6ea8f1 100644 --- a/app/components/homescreen/blocks/community.html.erb +++ b/app/components/homescreen/blocks/community.html.erb @@ -12,61 +12,31 @@ <%= static_link_to(EnterpriseToken.active? ? :enterprise_support : :enterprise_support_as_community) %>
  • - <%= link_to( - t("label_openproject_website"), - OpenProject::Static::Links.url_for( - :website, - url_params: { - utm_source: "unknown", - utm_medium: "op-instance", - utm_campaign: "website-home-screen" - } - ), - { - aria: { label: t("label_openproject_website") }, - target: "_blank", - title: t("label_openproject_website"), - rel: "noopener" - } - ) %> + <%= static_link_to :website, + label: t("label_openproject_website"), + url_params: { + utm_source: "unknown", + utm_medium: "op-instance", + utm_campaign: "website-home-screen" + } %>
  • - <%= link_to( - t("homescreen.links.security_alerts"), - OpenProject::Static::Links.url_for( - :security_alerts, - url_params: { - utm_source: "unknown", - utm_medium: "op-instance", - utm_campaign: "security-alerts-home-screen" - } - ), - { - aria: { label: t("homescreen.links.security_alerts") }, - target: "_blank", - title: t("homescreen.links.security_alerts"), - rel: "noopener" - } - ) %> + <%= static_link_to :security_alerts, + label: t("homescreen.links.security_alerts"), + url_params: { + utm_source: "unknown", + utm_medium: "op-instance", + utm_campaign: "security-alerts-home-screen" + } %>
  • - <%= link_to( - t("homescreen.links.newsletter"), - OpenProject::Static::Links.url_for( - :newsletter, - url_params: { - utm_source: "unknown", - utm_medium: "op-instance", - utm_campaign: "newsletter-home-screen" - } - ), - { - aria: { label: t("homescreen.links.newsletter") }, - target: "_blank", - title: t("homescreen.links.newsletter"), - rel: "noopener" - } - ) %> + <%= static_link_to :newsletter, + label: t("homescreen.links.newsletter"), + url_params: { + utm_source: "unknown", + utm_medium: "op-instance", + utm_campaign: "newsletter-home-screen" + } %>
  • <%= static_link_to :blog %> diff --git a/app/components/homescreen/link_component.html.erb b/app/components/homescreen/link_component.html.erb index fc918c0df5f..616797cae60 100644 --- a/app/components/homescreen/link_component.html.erb +++ b/app/components/homescreen/link_component.html.erb @@ -30,6 +30,7 @@ See COPYRIGHT and LICENSE files for more details. <%= link_to url, class: "homescreen--links--item", target: "_blank", + data: { allow_external_link: true }, aria_label: title, rel: "noopener" do %> <%= render(Primer::Beta::Octicon.new(icon: link[:icon], size: :medium)) %> diff --git a/app/components/mcp_configurations/edit_row_component.rb b/app/components/mcp_configurations/edit_row_component.rb new file mode 100644 index 00000000000..24c61e4965e --- /dev/null +++ b/app/components/mcp_configurations/edit_row_component.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpConfigurations + class EditRowComponent < OpPrimer::BorderBoxRowComponent + def name + render( + Primer::Beta::Text.new( + font_weight: :bold, + data: { test_selector: "mcp-configuration--config-row-name" } + ) + ) { config.identifier.split("/", 2).last } + end + + def title + render( + Primer::Alpha::TextField.new( + name: "mcp_configurations[#{config.identifier}][title]", + label: McpConfiguration.human_attribute_name(:title), + visually_hide_label: true, + value: config.title, + data: { test_selector: "mcp-configuration--title-input-#{config.identifier}" } + ) + ) + end + + def description + render( + Primer::Alpha::TextArea.new( + name: "mcp_configurations[#{config.identifier}][description]", + label: McpConfiguration.human_attribute_name(:description), + visually_hide_label: true, + value: config.description, + rows: 4, + data: { test_selector: "mcp-configuration--description-input-#{config.identifier}" } + ) + ) + end + + def enabled + render( + Primer::Alpha::CheckBox.new( + name: "mcp_configurations[#{config.identifier}][enabled]", + label: McpConfiguration.human_attribute_name(:enabled), + visually_hide_label: true, + checked: config.enabled, + test_selector: "mcp-configuration--enabled-input-#{config.identifier}" + ) + ) + end + + private + + def config + model + end + end +end diff --git a/app/components/mcp_configurations/edit_table_component.rb b/app/components/mcp_configurations/edit_table_component.rb new file mode 100644 index 00000000000..c34a26be6f9 --- /dev/null +++ b/app/components/mcp_configurations/edit_table_component.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpConfigurations + class EditTableComponent < OpPrimer::BorderBoxTableComponent + columns :name, :title, :description, :enabled + + def headers + [ + [:name, { caption: McpConfiguration.human_attribute_name(:name) }], + [:title, { caption: McpConfiguration.human_attribute_name(:title) }], + [:description, { caption: McpConfiguration.human_attribute_name(:description) }], + [:enabled, { caption: McpConfiguration.human_attribute_name(:enabled) }] + ] + end + + def mobile_title + "TODO: Does mobile even make sense?" + end + + def row_class + EditRowComponent + end + end +end diff --git a/app/components/mcp_configurations/multiple_configurations_component.html.erb b/app/components/mcp_configurations/multiple_configurations_component.html.erb new file mode 100644 index 00000000000..68862e5a667 --- /dev/null +++ b/app/components/mcp_configurations/multiple_configurations_component.html.erb @@ -0,0 +1,34 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= primer_form_with(url: multi_update_mcp_configurations_path) do %> + <%= render(McpConfigurations::EditTableComponent.new(rows: configurations)) %> + + <%= render(Primer::Beta::Button.new(type: :submit, mt: 3)) { submit_label } %> +<% end %> diff --git a/app/components/mcp_configurations/multiple_configurations_component.rb b/app/components/mcp_configurations/multiple_configurations_component.rb new file mode 100644 index 00000000000..90e8f98f754 --- /dev/null +++ b/app/components/mcp_configurations/multiple_configurations_component.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpConfigurations + class MultipleConfigurationsComponent < ApplicationComponent + include OpPrimer::ComponentHelpers + + attr_reader :submit_label + + alias_method :configurations, :model + + def initialize(*, submit_label:, **) + super(*, **) + + @submit_label = submit_label + end + end +end diff --git a/app/components/my/access_token/access_token_created_dialog_component.html.erb b/app/components/my/access_token/access_token_created_dialog_component.html.erb index 89ea8ac967d..6b78f49d4fb 100644 --- a/app/components/my/access_token/access_token_created_dialog_component.html.erb +++ b/app/components/my/access_token/access_token_created_dialog_component.html.erb @@ -67,7 +67,7 @@ See COPYRIGHT and LICENSE files for more details. end flex.with_row do render(Primer::Alpha::Banner.new(scheme: :warning, icon: :alert)) do - I18n.t(:warning, scope: i18n_scope) + I18n.t("my.access_token.created_dialog.one_time_warning") end end end diff --git a/app/components/my/access_token/api/row_component.rb b/app/components/my/access_token/api/row_component.rb index ab642047b93..4017d13fcd6 100644 --- a/app/components/my/access_token/api/row_component.rb +++ b/app/components/my/access_token/api/row_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ @@ -31,14 +31,14 @@ module My module AccessToken module API - class RowComponent < ::RowComponent + class RowComponent < OpPrimer::BorderBoxRowComponent def api_token model end def token_name - if api_token.token_name.nil? - t("my_account.access_tokens.api.static_token_name") + if !api_token.respond_to?(:token_name) || api_token.token_name.nil? + t(:static_token_name, scope: i18n_token_scope) else api_token.token_name end @@ -57,27 +57,34 @@ module My end def delete_link - link_to "", - { - action: delete_action, - access_token_id: api_token.id - }, - data: { - turbo_method: :delete, - turbo_confirm: t("my_account.access_tokens.simple_revoke_confirmation"), - test_selector: "api-token-revoke" - }, - class: "icon icon-delete" + render(Primer::Beta::IconButton.new( + icon: :trash, + scheme: :danger, + tag: :a, + href: delete_path, + "aria-label": t(:button_delete), + tooltip_direction: :w, + test_selector: "api-token-revoke", + data: { + turbo_method: :delete, + turbo_confirm: t("my_account.access_tokens.simple_revoke_confirmation") + } + )) end private - def delete_action + def delete_path case model - when Token::API then :revoke_api_key - when Token::ICalMeeting then :revoke_ical_meeting_token + when Token::API then my_access_token_revoke_api_key_path(api_token.id) + when Token::ICalMeeting then my_access_token_revoke_ical_meeting_token_path(api_token.id) + when Token::RSS then revoke_rss_key_my_access_tokens_path(api_token.id) end end + + def i18n_token_scope + [:my_account, :access_tokens, api_token.class.model_name.i18n_key] + end end end end diff --git a/app/components/my/access_token/api/table_component.rb b/app/components/my/access_token/api/table_component.rb index dc0cd690e53..8be1c034073 100644 --- a/app/components/my/access_token/api/table_component.rb +++ b/app/components/my/access_token/api/table_component.rb @@ -31,25 +31,54 @@ module My module AccessToken module API - class TableComponent < ::TableComponent - def initial_sort - %i[id asc] - end + class TableComponent < OpPrimer::BorderBoxTableComponent + columns :token_name, :created_at, :expires_on + main_column :token_name + mobile_labels :created_at, :expires_on - def sortable? - false + def initialize(title:, token_type:, **) + super(**) + + @title = title + @token_type = token_type end def headers [ - ["token_name", { caption: I18n.t("attributes.name") }], - ["created_at", { caption: User.human_attribute_name(:created_at) }], - ["expires_on", { caption: I18n.t("my_account.access_tokens.headers.expiration") }] + [:token_name, { caption: I18n.t("attributes.name") }], + [:created_at, { caption: User.human_attribute_name(:created_at) }], + [:expires_on, { caption: I18n.t("my_account.access_tokens.headers.expiration") }] ] end - def columns - headers.map(&:first) + def mobile_title + @title + end + + def row_class + RowComponent + end + + def has_actions? + true + end + + def blank_title + I18n.t(:blank_title, scope: i18n_token_scope) + end + + def blank_description + I18n.t(:blank_description, scope: i18n_token_scope) + end + + def blank_icon + nil + end + + private + + def i18n_token_scope + [:my_account, :access_tokens, @token_type.model_name.i18n_key] end end end diff --git a/app/components/my/access_token/api_tokens_section_component.html.erb b/app/components/my/access_token/api_tokens_section_component.html.erb index 7744e5ff1d8..25be0ac8612 100644 --- a/app/components/my/access_token/api_tokens_section_component.html.erb +++ b/app/components/my/access_token/api_tokens_section_component.html.erb @@ -27,44 +27,37 @@ See COPYRIGHT and LICENSE files for more details. ++#%> -<%= component_wrapper do %> -
    -
    -
    -

    <%= t(:title, scope: i18n_scope) %>

    -
    -
    -
    -

    <%= t(:text_hint, scope: i18n_scope) %>

    - <% if token_available? %> - <% if @tokens.any? %> - <%= render My::AccessToken::API::TableComponent.new(rows: @tokens) %> - <% end %> - <%= render( - Primer::Beta::Button.new( - tag: :a, - mt: 3, - scheme: :secondary, - test_selector: "#{token_type.model_name.element}-token-add", - href: dialog_my_access_tokens_path(token_type: token_type.model_name.element), - data: { turbo_stream: true }, - aria: { label: t(:add_button, scope: i18n_scope) }, - role: "button", - title: t(:add_button, scope: i18n_scope) - ) - ) do |button| - button.with_leading_visual_icon(icon: add_button_icon) - t(:add_button, scope: i18n_scope) - end %> - <% else %> -
    - -
    - <% end %> -
    -
    +<%= component_wrapper(class: "mb-4") do %> + <%= render(Primer::Beta::Subhead.new) do |component| + component.with_heading(tag: :h3, size: :medium) do + t(:title, scope: i18n_scope) + end + component.with_description do + t(:text_hint, scope: i18n_scope) + end + end %> + + <% if token_available? %> + <%= render My::AccessToken::API::TableComponent.new(rows: @tokens, title: t(:table_title, scope: i18n_scope), token_type:) %> + <% if show_add_button? %> + <%= render( + Primer::Beta::Button.new( + tag: :a, + mt: 3, + scheme: :secondary, + test_selector: "#{token_type.model_name.element}-token-add", + href: add_button_path, + data: { turbo_stream: true, turbo_method: add_button_method }, + aria: { label: t(:add_button, scope: i18n_scope) }, + role: "button", + title: t(:add_button, scope: i18n_scope) + ) + ) do |button| + button.with_leading_visual_icon(icon: add_button_icon) + t(:add_button, scope: i18n_scope) + end %> + <% end %> + <% else %> + <%= render(Primer::Alpha::Banner.new(icon: :info)) { t(:disabled_text, scope: i18n_scope) } %> + <% end %> <% end %> diff --git a/app/components/my/access_token/api_tokens_section_component.rb b/app/components/my/access_token/api_tokens_section_component.rb index 23cb48834f0..8c2625a9415 100644 --- a/app/components/my/access_token/api_tokens_section_component.rb +++ b/app/components/my/access_token/api_tokens_section_component.rb @@ -58,16 +58,37 @@ module My case token_type.to_s when "Token::API" then Setting.rest_api_enabled? when "Token::ICalMeeting" then Setting.ical_enabled? + when "Token::RSS" then Setting.feeds_enabled? else raise ArgumentError, "Unknown token type: #{token_type}" end end + def show_add_button? + return @tokens.empty? if token_type.to_s == "Token::RSS" + + true + end + def add_button_icon case token_type.to_s - when "Token::ICalMeeting" then :rss + when "Token::RSS", "Token::ICalMeeting" then :rss else :plus end end + + def add_button_method + case token_type.to_s + when "Token::RSS" then :post + else :get + end + end + + def add_button_path + case token_type.to_s + when "Token::RSS" then generate_rss_key_my_access_tokens_path + else dialog_my_access_tokens_path(token_type: token_type.model_name.element) + end + end end end end diff --git a/app/components/my/access_token/ical/row_component.rb b/app/components/my/access_token/ical/row_component.rb new file mode 100644 index 00000000000..1bb746db502 --- /dev/null +++ b/app/components/my/access_token/ical/row_component.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module ICal + class RowComponent < OpPrimer::BorderBoxRowComponent + def api_token + model + end + + def name + render(Primer::Beta::Text.new(test_selector: "ical-token-#{api_token.id}-name")) do + api_token.ical_token_query_assignment.name + end + end + + def calendar + render( + Primer::Beta::Link.new( + href: project_calendar_path(id: api_token.query.id, project_id: api_token.query.project_id), + test_selector: "ical-token-#{api_token.id}-query-name" + ) + ) { api_token.query.name } + end + + def project + render(Primer::Beta::Text.new(test_selector: "ical-token-#{api_token.id}-project-name")) do + api_token.query.project.name + end + end + + def created_at + helpers.format_time(api_token.created_at) + end + + def expires_on + I18n.t("my_account.access_tokens.indefinite_expiration") + end + + def button_links + [delete_link].compact + end + + def delete_link + render(Primer::Beta::IconButton.new( + icon: :trash, + scheme: :danger, + tag: :a, + href: my_access_token_revoke_ical_token_path(access_token_id: api_token.id), + "aria-label": t(:button_delete), + tooltip_direction: :w, + test_selector: "ical-token-#{api_token.id}-revoke", + data: { + turbo_method: :delete, + turbo_confirm: t("my_account.access_tokens.simple_revoke_confirmation") + } + )) + end + end + end + end +end diff --git a/app/components/my/access_token/ical/table_component.rb b/app/components/my/access_token/ical/table_component.rb new file mode 100644 index 00000000000..8d9f3f174a6 --- /dev/null +++ b/app/components/my/access_token/ical/table_component.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module ICal + class TableComponent < OpPrimer::BorderBoxTableComponent + columns :name, :calendar, :project, :created_at, :expires_on + main_column :name + mobile_labels :created_at, :expires_on + + def headers + [ + [:name, { caption: I18n.t("attributes.name") }], + [:calendar, { caption: Token::ICal.human_attribute_name(:calendar) }], + [:project, { caption: WorkPackage.human_attribute_name(:project) }], + [:created_at, { caption: User.human_attribute_name(:created_at) }], + [:expires_on, { caption: I18n.t("my_account.access_tokens.headers.expiration") }] + ] + end + + def mobile_title + I18n.t("my_account.access_tokens.ical.table_title") + end + + def row_class + RowComponent + end + + def has_actions? + true + end + + def blank_title + I18n.t("my_account.access_tokens.ical.blank_title") + end + + def blank_description + I18n.t("my_account.access_tokens.ical.blank_description") + end + + def blank_icon + nil + end + end + end + end +end diff --git a/app/components/my/access_token/oauth_application/row_component.rb b/app/components/my/access_token/oauth_application/row_component.rb new file mode 100644 index 00000000000..e3ea34c45fe --- /dev/null +++ b/app/components/my/access_token/oauth_application/row_component.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module OAuthApplication + class RowComponent < OpPrimer::BorderBoxRowComponent + def oauth_application + model.first + end + + def oauth_application_tokens + model.last + end + + def name + render(Primer::Beta::Text.new(test_selector: "oauth-application-#{oauth_application.id}-name")) do + oauth_application.name + end + end + + def active_tokens + render(Primer::Beta::Text.new(test_selector: "oauth-application-#{oauth_application.id}-active-tokens")) do + oauth_application_tokens.count { |t| !t.expired? && !t.revoked? }.to_s + end + end + + def last_used_at + return "—" if oauth_application_tokens.empty? + + helpers.format_time(oauth_application_tokens.max_by(&:created_at).created_at) + end + + def button_links + [delete_link].compact + end + + def delete_link + render(Primer::Beta::IconButton.new( + icon: :trash, + scheme: :danger, + tag: :a, + href: revoke_my_oauth_application_path(application_id: oauth_application.id), + "aria-label": t(:button_delete), + tooltip_direction: :w, + test_selector: "oauth-token-row-#{oauth_application.id}-revoke", + data: { + turbo_method: :post, + turbo_confirm: t( + "oauth.revoke_my_application_confirmation", + token_count: t( + "oauth.x_active_tokens", + count: oauth_application_tokens.count + ) + ) + } + )) + end + end + end + end +end diff --git a/app/components/my/access_token/oauth_application/table_component.rb b/app/components/my/access_token/oauth_application/table_component.rb new file mode 100644 index 00000000000..05ee5ed61b0 --- /dev/null +++ b/app/components/my/access_token/oauth_application/table_component.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module OAuthApplication + class TableComponent < OpPrimer::BorderBoxTableComponent + columns :name, :active_tokens, :last_used_at + main_column :name + mobile_labels :active_tokens, :last_used_at + + def headers + [ + [:name, { caption: I18n.t("attributes.name") }], + [:active_tokens, { caption: I18n.t("my_account.access_tokens.oauth_application.active_tokens") }], + [:last_used_at, { caption: I18n.t("my_account.access_tokens.oauth_application.last_used_at") }] + ] + end + + def mobile_title + I18n.t("my_account.access_tokens.oauth_application.table_title") + end + + def row_class + RowComponent + end + + def has_actions? + true + end + + def blank_title + I18n.t("my_account.access_tokens.oauth_application.blank_title") + end + + def blank_description + I18n.t("my_account.access_tokens.oauth_application.blank_description") + end + + def blank_icon + nil + end + end + end + end +end diff --git a/app/components/my/access_token/oauth_client/row_component.rb b/app/components/my/access_token/oauth_client/row_component.rb new file mode 100644 index 00000000000..8cb448b2254 --- /dev/null +++ b/app/components/my/access_token/oauth_client/row_component.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module OAuthClient + class RowComponent < OpPrimer::BorderBoxRowComponent + def client_token + model + end + + def name + render(Primer::Beta::Text.new(test_selector: "oauth-client-token-#{row.id}")) do + client_token.oauth_client.integration.name + end + end + + def integration_type + integration_class_name = client_token.oauth_client.integration_type + integration_class = begin + integration_class_name.constantize + rescue NameError + nil + end + + return I18n.t("my_account.access_tokens.oauth_client.unknown_integration") unless integration_class + + integration_class.model_name.human + end + + def created_at + helpers.format_time(client_token.created_at) + end + + def expires_on + helpers.format_time(client_token.updated_at + client_token.expires_in.seconds) + end + + def button_links + [delete_link].compact + end + + def delete_link + render(Primer::Beta::IconButton.new( + icon: :trash, + scheme: :danger, + tag: :a, + href: my_access_token_remove_oauth_client_token_path(client_token), + "aria-label": t(:button_delete), + tooltip_direction: :w, + test_selector: "oauth-client-token-#{client_token.id}-remove", + data: { + turbo_method: :delete, + turbo_confirm: t( + "my_account.access_tokens.oauth_client.remove_token", + integration: client_token.oauth_client.integration.name + ) + } + )) + end + end + end + end +end diff --git a/app/components/my/access_token/oauth_client/table_component.rb b/app/components/my/access_token/oauth_client/table_component.rb new file mode 100644 index 00000000000..25c990dab4b --- /dev/null +++ b/app/components/my/access_token/oauth_client/table_component.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + module AccessToken + module OAuthClient + class TableComponent < OpPrimer::BorderBoxTableComponent + columns :name, :integration_type, :created_at, :expires_on + main_column :name + mobile_labels :created_at, :expires_on + + def headers + [ + [:name, { caption: I18n.t("attributes.name") }], + [:integration_type, { caption: I18n.t("my_account.access_tokens.oauth_client.integration_type") }], + [:created_at, { caption: User.human_attribute_name(:created_at) }], + [:expires_on, { caption: I18n.t("my_account.access_tokens.headers.expiration") }] + ] + end + + def mobile_title + I18n.t("my_account.access_tokens.oauth_client.table_title") + end + + def row_class + RowComponent + end + + def has_actions? + true + end + + def blank_title + I18n.t("my_account.access_tokens.oauth_client.blank_title") + end + + def blank_description + I18n.t("my_account.access_tokens.oauth_client.blank_description") + end + + def blank_icon + nil + end + end + end + end +end diff --git a/app/components/my/password_confirmation_dialog.html.erb b/app/components/my/password_confirmation_dialog.html.erb new file mode 100644 index 00000000000..ff23fa4fe76 --- /dev/null +++ b/app/components/my/password_confirmation_dialog.html.erb @@ -0,0 +1,61 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= render(Primer::Alpha::Dialog.new( + id: "password-confirmation-dialog", + title: t(".title"), + data: { controller: "password-confirmation-dialog" }, + test_selector: "op-my--password-confirmation-dialog" + )) do |dialog| + dialog.with_body do + content_tag(:form, id: "password-confirmation-form", data: { password_confirmation_dialog_target: "form" }) do + render(Primer::Alpha::TextField.new( + type: "password", + name: "password_confirmation", + label: User.human_attribute_name(:password), + caption: t(".confirmation_required"), + data: { password_confirmation_dialog_target: "passwordInput" } + )) + end + end + + dialog.with_footer do + concat(render(Primer::Beta::Button.new(data: { "close-dialog-id": "password-confirmation-dialog" })) { t("button_cancel") }) + concat( + render(Primer::Beta::Button.new( + scheme: :primary, + type: :submit, + form: "password-confirmation-form", + test_selector: "op-my--password-confirmation-dialog--submit-button", + data: { password_confirmation_dialog_target: "submitButton" } + )) { t("button_confirm") } + ) + end + end +%> diff --git a/app/components/my/password_confirmation_dialog.rb b/app/components/my/password_confirmation_dialog.rb new file mode 100644 index 00000000000..3c417300960 --- /dev/null +++ b/app/components/my/password_confirmation_dialog.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module My + class PasswordConfirmationDialog < ApplicationComponent + include OpTurbo::Streamable + end +end diff --git a/app/views/my/access_tokens/_token_table_header.html.erb b/app/components/op_primer/full_page_prompt_component.html.erb similarity index 69% rename from app/views/my/access_tokens/_token_table_header.html.erb rename to app/components/op_primer/full_page_prompt_component.html.erb index 42978397726..e6216fd79b7 100644 --- a/app/views/my/access_tokens/_token_table_header.html.erb +++ b/app/components/op_primer/full_page_prompt_component.html.erb @@ -26,27 +26,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. ++#%> - - <% column_headers&.length&.times do %> - + +<%= render(Primer::Box.new(classes: "op-full-page-prompt")) do %> + <%= icon %> + <%= title %> + <%= content %> + + <%= render(Primer::Box.new(classes: "op-full-page-prompt--action-box", mt: 3)) do %> + <%= action %> <% end %> - - - - - <% column_headers&.each do |column_header| %> - -
    -
    - <%= column_header %> -
    -
    - - <% end %> - -
    -
    -
    - - - +<% end %> diff --git a/app/components/op_primer/warning_text.rb b/app/components/op_primer/full_page_prompt_component.rb similarity index 58% rename from app/components/op_primer/warning_text.rb rename to app/components/op_primer/full_page_prompt_component.rb index 7f95dfa8fb5..467e7f83917 100644 --- a/app/components/op_primer/warning_text.rb +++ b/app/components/op_primer/full_page_prompt_component.rb @@ -29,31 +29,31 @@ #++ module OpPrimer - # A simple component to render warning text. - # - # The warning text is rendered in the "attention" Primer color and - # uses a leading alert Octicon for additional emphasis. This component - # is designed to be used "inline", e.g. table cells, and in places - # where a Banner component might be overkill. - class WarningText < Primer::Component # rubocop:disable OpenProject/AddPreviewForViewComponent - # @param show_warning_label [Boolean] whether to show a leading "Warning:" label - # @param system_arguments [Hash] <%= link_to_system_arguments_docs %> - def initialize(show_warning_label: true, **system_arguments) + class FullPagePromptComponent < Primer::Component + attr_reader :system_arguments + + renders_one :icon, lambda { |icon:, size: :medium, **system_arguments| + Primer::Beta::Octicon.new(icon:, size:, **system_arguments) + } + + renders_one :title, lambda { |tag: :h2, **system_arguments| + Primer::Beta::Heading.new(tag:, mb: 2, font_size: 5, **system_arguments) + } + + renders_one :action, types: { + button: lambda { |**system_arguments| + system_arguments[:classes] = class_names( + system_arguments[:classes], + "op-full-page-prompt--action" + ) + Primer::Beta::Button.new(**system_arguments) + } + } + + def initialize(**system_arguments) super() - @show_warning_label = show_warning_label @system_arguments = system_arguments - @system_arguments[:display] = :inline_flex - @system_arguments[:align_items] = :center - @system_arguments[:color] = :attention - end - - def show_warning_label? - !!@show_warning_label - end - - def render? - content.present? end end end diff --git a/app/components/op_primer/full_page_prompt_component.sass b/app/components/op_primer/full_page_prompt_component.sass new file mode 100644 index 00000000000..686028ee097 --- /dev/null +++ b/app/components/op_primer/full_page_prompt_component.sass @@ -0,0 +1,17 @@ +@import "helpers" + +.op-full-page-prompt + margin: 1rem auto 0 + padding: 2rem + width: 500px + text-align: center + + &--action-box + display: flex + + &--action + flex: 1 + + @media screen and (max-width: $breakpoint-md) + width: 100% + margin: 2rem 0 0 0 diff --git a/app/components/op_primer/status_button_component.html.erb b/app/components/op_primer/status_button_component.html.erb index edccd465d3f..b9683af283d 100644 --- a/app/components/op_primer/status_button_component.html.erb +++ b/app/components/op_primer/status_button_component.html.erb @@ -11,7 +11,7 @@ @items.each do |option| menu.with_item(**option.item_arguments) do |item| - item.with_leading_visual_icon(icon: option.icon) if option.icon + item.with_leading_visual_icon(icon: option.icon, classes: highlight_class_name(option, :inline)) if option.icon item.with_description.with_content(option.description) if option.description classes = option.colored? ? highlight_class_name(option, :inline) : "" diff --git a/app/components/op_primer/warning_text.html.erb b/app/components/op_primer/warning_text.html.erb deleted file mode 100644 index 5bde7f67804..00000000000 --- a/app/components/op_primer/warning_text.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= render(Primer::Beta::Text.new(**@system_arguments)) do %> - <%= render(Primer::Beta::Octicon.new(icon: :"alert-fill", size: :xsmall, mr: 2, aria: { hidden: true })) %> - - <%= render(Primer::Beta::Text.new(tag: :strong).with_content("#{I18n.t(:warning)}:")) if show_warning_label? %> - <%= content %> - -<% end %> diff --git a/app/components/open_project/common/check_all_component.html.erb b/app/components/open_project/common/check_all_component.html.erb index e5d68bf217f..3bcc5ceafbb 100644 --- a/app/components/open_project/common/check_all_component.html.erb +++ b/app/components/open_project/common/check_all_component.html.erb @@ -1,13 +1,17 @@ <% unless check_all_button? %> - <% with_check_all_button # set the default %> + <% with_check_all_button { I18n.t(:button_check_all) } # set the default %> <% end %> <% unless uncheck_all_button? %> - <% with_uncheck_all_button # set the default %> + <% with_uncheck_all_button { I18n.t(:button_uncheck_all) } # set the default %> +<% end %> + +<% unless separator? %> + <% with_separator { "|" } # set the default %> <% end %> <%= render(Primer::BaseComponent.new(**@system_arguments)) do %> <%= check_all_button %> - | + <%= separator %> <%= uncheck_all_button %> <% end %> diff --git a/app/components/open_project/common/check_all_component.rb b/app/components/open_project/common/check_all_component.rb index bfc85f475f7..a56749475ce 100644 --- a/app/components/open_project/common/check_all_component.rb +++ b/app/components/open_project/common/check_all_component.rb @@ -37,10 +37,13 @@ module OpenProject CHECKABLE_CONTROLLER_SELECTOR = "[data-controller~='checkable']" - renders_one :check_all_button, ->(text: I18n.t(:button_check_all), **system_arguments) { + renders_one :separator + + renders_one :check_all_button, ->(**system_arguments) { action = use_outlet? ? "check-all#checkAll:stop" : "checkable#checkAll:stop" controls = checkable_id if use_outlet? + system_arguments[:scheme] ||= :link system_arguments[:id] = "#{base_id}-check-all" system_arguments[:data] = merge_data( system_arguments, { @@ -51,13 +54,14 @@ module OpenProject system_arguments, { aria: { controls: } } ) - Primer::Beta::Button.new(scheme: :link, **system_arguments).with_content(text) + Primer::Beta::Button.new(**system_arguments) } - renders_one :uncheck_all_button, ->(text: I18n.t(:button_uncheck_all), **system_arguments) { + renders_one :uncheck_all_button, ->(**system_arguments) { action = use_outlet? ? "check-all#uncheckAll:stop" : "checkable#uncheckAll:stop" controls = checkable_id if use_outlet? + system_arguments[:scheme] ||= :link system_arguments[:id] = "#{base_id}-uncheck-all" system_arguments[:data] = merge_data( system_arguments, { @@ -68,7 +72,7 @@ module OpenProject system_arguments, { aria: { controls: } } ) - Primer::Beta::Button.new(scheme: :link, **system_arguments).with_content(text) + Primer::Beta::Button.new(**system_arguments) } # This Component can be used in *two* ways. diff --git a/app/components/projects/export_list_modal_component.html.erb b/app/components/projects/export_list_modal_component.html.erb deleted file mode 100644 index 398d929a8b9..00000000000 --- a/app/components/projects/export_list_modal_component.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -<%= render( - Primer::Alpha::Dialog.new( - title: t("js.label_export"), - id: MODAL_ID - ) - ) do |d| %> - <% d.with_header(variant: :large) %> - <% d.with_body do %> - - <% end %> -<% end %> diff --git a/app/components/projects/index_page_header_component.html.erb b/app/components/projects/index_page_header_component.html.erb index 38b9814bd3a..5df22b09e3b 100644 --- a/app/components/projects/index_page_header_component.html.erb +++ b/app/components/projects/index_page_header_component.html.erb @@ -126,13 +126,18 @@ end if can_export? - menu.with_item( - tag: :a, - label: t("js.label_export"), - href: export_list_modal_projects_path(projects_query_params), - content_arguments: { data: { controller: "async-dialog" }, rel: "nofollow" } - ) do |item| - item.with_leading_visual_icon(icon: :download) + menu.with_sub_menu_item(label: t("js.label_export")) do |submenu| + submenu.with_leading_visual_icon(icon: :download) + helpers.supported_export_formats.each do |key| + submenu.with_item( + label: t("export.format.#{key}"), + tag: :a, + href: projects_path(format: key, **helpers.projects_query_params.except(:page, :per_page)), + content_arguments: { data: { controller: "job-dialog" }, rel: "nofollow" } + ) do |item| + item.with_leading_visual_icon(icon: "op-#{key == "csv" ? "file-csv" : key}") + end + end end end diff --git a/app/components/projects/project_creation_footer_component.rb b/app/components/projects/project_creation_footer_component.rb index a47a1305fc7..83f9a1be854 100644 --- a/app/components/projects/project_creation_footer_component.rb +++ b/app/components/projects/project_creation_footer_component.rb @@ -32,18 +32,19 @@ module Projects class ProjectCreationFooterComponent < ApplicationComponent include OpPrimer::ComponentHelpers - def initialize(form_identifier:, project:, template:, current_step:) + def initialize(form_identifier:, project:, template:, current_step:, cancel_href:) @form_identifier = form_identifier @project = project @template = template @current_step = current_step + @cancel_href = cancel_href super end def call render(StepWizard::FooterComponent.new(form_identifier:, total_steps:, current_step:)) do |footer| - footer.with_cancel_button(href: projects_path) + footer.with_cancel_button(href: cancel_href) footer.with_continue_button(**continue_button_args) footer.with_submit_button(**submit_button_args) if show_progress_bar? @@ -52,7 +53,7 @@ module Projects end end - attr_reader :form_identifier, :project, :template, :current_step + attr_reader :form_identifier, :project, :template, :current_step, :cancel_href private diff --git a/app/components/projects/row_component.rb b/app/components/projects/row_component.rb index 9c08a097571..555b6152a09 100644 --- a/app/components/projects/row_component.rb +++ b/app/components/projects/row_component.rb @@ -154,19 +154,45 @@ module Projects end def name - content = [content_tag(:i, "", class: "projects-table--hierarchy-icon")] + content = [ + hierarchy_icon, + name_link_section, + archived_label, + workspace_type_badge + ].compact_blank - content << helpers.link_to_project(project, {}, { data: { turbo: false } }, false) + content_tag(:div, safe_join(content), class: "projects-table--name") + end - if project.archived? - content << content_tag(:span, "(#{I18n.t('project.archive.archived')})", class: "archived-label") + def hierarchy_icon + content_tag(:i, "", class: "projects-table--hierarchy-icon") + end + + def name_link_section + content_tag(:span, class: "projects-table--name-text") do + helpers.link_to_project(project, {}, { data: { turbo: false } }, false) end + end - if workspace_type_badge && OpenProject::FeatureDecisions.portfolio_models_active? - content << workspace_type_badge + def workspace_type_badge + return unless OpenProject::FeatureDecisions.portfolio_models_active? + # Only show icon and type for non-project workspaces + return unless project.workspace_type.in?(["portfolio", "program"]) + + render(Primer::Beta::Text.new(classes: "projects-table--name-description")) do + icon = render(Primer::Beta::Octicon.new( + icon: helpers.workspace_icon(project.workspace_type), + size: :xsmall + )) + + safe_join([icon, " ", I18n.t(:"label_#{project.workspace_type}")]) end + end - safe_join(content, " ") + def archived_label + return unless project.archived? + + content_tag(:span, "(#{I18n.t('project.archive.archived')})", class: "archived-label") end def project_status @@ -429,18 +455,5 @@ module Projects def current_page table.model.current_page.to_s end - - def workspace_type_badge - # Only show icon and type for non-project workspaces - return unless project.workspace_type.in?(["portfolio", "program"]) - - render(Primer::Beta::Text.new(classes: "description")) do - icon = render(Primer::Beta::Octicon.new( - icon: helpers.workspace_icon(project.workspace_type), - size: :xsmall - )) - safe_join([icon, " ", I18n.t(:"label_#{project.workspace_type}")]) - end - end end end diff --git a/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.html.erb b/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.html.erb index 4ac9f4595a1..0ae9907be13 100644 --- a/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.html.erb +++ b/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.html.erb @@ -32,18 +32,51 @@ end end custom_field_container.with_column(py: 1, mr: 2) do - render( - Primer::Alpha::ToggleSwitch.new( - src: toggle_path, - csrf_token: form_authenticity_token, - data: toggle_data_attributes, - checked: toggle_checked?, - enabled: toggle_enabled?, - size: :small, - status_label_position: :start, - classes: "op-primer-adjustments__toggle-switch--hidden-loading-indicator" + concat( + render( + Primer::Alpha::ToggleSwitch.new( + src: toggle_path, + csrf_token: form_authenticity_token, + data: toggle_data_attributes, + checked: toggle_checked?, + enabled: toggle_enabled?, + size: :small, + status_label_position: :start, + classes: "op-primer-adjustments__toggle-switch--hidden-loading-indicator" + ) ) ) + + # As a courtesy to users, we show a hover card explaining why the toggle is disabled. + if toggle_disabled? + concat( + content_tag(:div, class: "op-hover-card--hidden-container") do + flex_layout( + id: unique_hovercard_id, + classes: "op-project-custom-field--popover", + data: { + test_selector: "op-project-custom-field--hover-card-#{@project_custom_field.id}" + } + ) do |hover_card| + hover_card.with_column do + render(Primer::Beta::Text.new) do + if configured_as_creation_wizard_assignee? + t( + "projects.settings.project_custom_fields.enabled_via_assignee_when_submitted_html", + pir_submission_url: project_settings_creation_wizard_path(tab: "submission") + ) + else + t( + "projects.settings.creation_wizard.enabled_because_required_html", + admin_settings_url: admin_settings_project_custom_fields_path + ) + end + end + end + end + end + ) + end end end end diff --git a/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.rb b/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.rb index 80aeb6c5276..ffe15983c00 100644 --- a/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.rb +++ b/app/components/projects/settings/creation_wizard/project_custom_field_sections/custom_field_row_component.rb @@ -45,6 +45,8 @@ module Projects end def toggle_checked? + return true if toggle_force_checked? + mapping = @project_custom_field_project_mappings.find do |m| m.custom_field_id == @project_custom_field.id end @@ -57,15 +59,22 @@ module Projects end end - def toggle_enabled? - !@project_custom_field.required? + def toggle_force_checked? + @project_custom_field.required? || + configured_as_creation_wizard_assignee? end def toggle_data_attributes { "turbo-method": :post, test_selector: "toggle-creation-wizard-project-custom-field-#{@project_custom_field.id}" - } + }.tap do |data| + if toggle_disabled? + # Add hover card that explains why this toggle switch is disabled + data[:hover_card_trigger_target] = "trigger" + data[:hover_card_popover_id] = unique_hovercard_id + end + end end end end diff --git a/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.html.erb b/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.html.erb index d7aa1f0475a..757625840dd 100644 --- a/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.html.erb +++ b/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.html.erb @@ -31,24 +31,55 @@ end end end + # py: 1 quick fix: prevents the row from bouncing as the toggle switch currently changes height while toggling custom_field_container.with_column(py: 1, mr: 2) do - # buggy currently: - # small variant + status_label_position: :start leads to a small bounce while toggling - # behavior can be seen on primer's viewbook as well -> https://view-components-storybook.eastus.cloudapp.azure.com/view-components/lookbook/inspect/primer/alpha/toggle_switch/small - # quick fix: don't display loading indicator which is causing the bounce - render( - Primer::Alpha::ToggleSwitch.new( - src: toggle_path, - csrf_token: form_authenticity_token, - data: toggle_data_attributes, - checked: toggle_checked?, - enabled: toggle_enabled?, - size: :small, - status_label_position: :start, - classes: "op-primer-adjustments__toggle-switch--hidden-loading-indicator" + concat( + # buggy currently: + # small variant + status_label_position: :start leads to a small bounce while toggling + # behavior can be seen on primer's viewbook as well -> https://view-components-storybook.eastus.cloudapp.azure.com/view-components/lookbook/inspect/primer/alpha/toggle_switch/small + # quick fix: don't display loading indicator which is causing the bounce + render( + Primer::Alpha::ToggleSwitch.new( + src: toggle_path, + csrf_token: form_authenticity_token, + data: toggle_data_attributes, + checked: toggle_checked?, + enabled: toggle_enabled?, + size: :small, + status_label_position: :start, + classes: "op-primer-adjustments__toggle-switch--hidden-loading-indicator" + ) ) ) + + # As a courtesy to users, we show a hover card explaining why the toggle is disabled. + if toggle_disabled? + concat( + content_tag(:div, class: "op-hover-card--hidden-container") do + flex_layout( + id: unique_hovercard_id, + classes: "op-project-custom-field--popover", + data: { + test_selector: "op-project-custom-field--hover-card-#{@project_custom_field.id}" + } + ) do |hover_card| + hover_card.with_column do + render(Primer::Beta::Text.new) do + if configured_as_creation_wizard_assignee? + t( + "projects.settings.project_custom_fields.enabled_via_assignee_when_submitted_html", + pir_submission_url: project_settings_creation_wizard_path(tab: "submission") + ) + else + t("projects.settings.project_custom_fields.is_for_all_blank_slate.description") + end + end + end + end + end + ) + end end end end diff --git a/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.rb b/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.rb index 1f5891239c7..16974f62431 100644 --- a/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.rb +++ b/app/components/projects/settings/project_custom_field_sections/custom_field_row_component.rb @@ -66,19 +66,39 @@ module Projects end def toggle_checked? - active_in_project? + active_in_project? || toggle_force_checked? end - def toggle_enabled? - !@project_custom_field.is_for_all? + def toggle_force_checked? + @project_custom_field.is_for_all? || + configured_as_creation_wizard_assignee? end + def toggle_enabled? = !toggle_disabled? + + def toggle_disabled? = toggle_force_checked? + def toggle_data_attributes { "turbo-method": :put, "turbo-stream": true, test_selector: "toggle-project-custom-field-mapping-#{@project_custom_field.id}" - } + }.tap do |data| + if toggle_disabled? + # Add hover card that explains why this toggle switch is disabled + data[:hover_card_trigger_target] = "trigger" + data[:hover_card_popover_id] = unique_hovercard_id + end + end + end + + def configured_as_creation_wizard_assignee? + @project.project_creation_wizard_enabled? && + @project.project_creation_wizard_assignee_custom_field_id == @project_custom_field.id + end + + def unique_hovercard_id + "project-custom-field-#{@project_custom_field.id}-disabled-reason" end end end diff --git a/app/components/projects/wizard/page_component.sass b/app/components/projects/wizard/page_component.sass index 59352545cc9..386e4f8a907 100644 --- a/app/components/projects/wizard/page_component.sass +++ b/app/components/projects/wizard/page_component.sass @@ -31,10 +31,12 @@ height: 100% min-height: 0 grid-template-areas: "sidebar main help" - grid-template-columns: 300px 1fr 350px - gap: var(--base-size-16, 1rem) + grid-template-columns: 300px 1fr 330px overflow: hidden + &--main + padding: 0 var(--base-size-16, 1rem) + &--sidebar, &--help border: var(--borderWidth-thin, 1px) solid var(--borderColor-default) diff --git a/app/components/settings/project_custom_field_sections/index_component.rb b/app/components/settings/project_custom_field_sections/index_component.rb index e6e15bb942e..954afe99e9f 100644 --- a/app/components/settings/project_custom_field_sections/index_component.rb +++ b/app/components/settings/project_custom_field_sections/index_component.rb @@ -59,7 +59,7 @@ module Settings def drop_target_config { - "is-drag-and-drop-target": true, + generic_drag_and_drop_target: "container", "target-allowed-drag-type": "section" # the type of dragged items which are allowed to be dropped in this target } end diff --git a/app/components/settings/project_custom_field_sections/show_component.rb b/app/components/settings/project_custom_field_sections/show_component.rb index 7fdb147f34c..d6c5203de2f 100644 --- a/app/components/settings/project_custom_field_sections/show_component.rb +++ b/app/components/settings/project_custom_field_sections/show_component.rb @@ -56,7 +56,7 @@ module Settings def drag_and_drop_target_config { - "is-drag-and-drop-target": true, + generic_drag_and_drop_target: "container", "target-container-accessor": ".Box > ul", # the accessor of the container that contains the drag and drop items "target-id": @project_custom_field_section.id, # the id of the target "target-allowed-drag-type": "custom-field" # the type of dragged items which are allowed to be dropped in this target diff --git a/app/components/settings/project_phase_definitions/index_component.html.erb b/app/components/settings/project_phase_definitions/index_component.html.erb index a513e34f074..70146686e5a 100644 --- a/app/components/settings/project_phase_definitions/index_component.html.erb +++ b/app/components/settings/project_phase_definitions/index_component.html.erb @@ -31,10 +31,12 @@ See COPYRIGHT and LICENSE files for more details. component_wrapper do flex_layout(data: wrapper_data_attributes) do |flex| flex.with_row do - render EnterpriseEdition::BannerComponent.new(:customize_life_cycle, - variant: :medium, - image: "enterprise/project-lifecycle.png", - mb: 3) + render EnterpriseEdition::BannerComponent.new( + :customize_life_cycle, + variant: :medium, + image: "enterprise/project-lifecycle.png", + mb: 3 + ) end if allowed_to_customize_life_cycle? @@ -56,11 +58,13 @@ See COPYRIGHT and LICENSE files for more details. } ) - subheader.with_action_button(scheme: :primary, - leading_icon: :plus, - label: I18n.t("settings.project_phase_definitions.label_add_description"), - tag: :a, - href: new_admin_settings_project_phase_definition_path) do + subheader.with_action_button( + scheme: :primary, + leading_icon: :plus, + label: I18n.t("settings.project_phase_definitions.label_add_description"), + tag: :a, + href: new_admin_settings_project_phase_definition_path + ) do I18n.t("settings.project_phase_definitions.label_add") end end @@ -69,7 +73,7 @@ See COPYRIGHT and LICENSE files for more details. flex.with_row do render(border_box_container(mb: 3, data: drop_target_config)) do |component| - component.with_header(font_weight: :bold, py: 2) do + component.with_header(font_weight: :bold) do flex_layout(justify_content: :space_between, align_items: :center) do |header_container| header_container.with_column do render(Primer::Beta::Text.new(font_weight: :bold)) do diff --git a/app/components/settings/project_phase_definitions/index_component.rb b/app/components/settings/project_phase_definitions/index_component.rb index c88b137fd30..bcdabc4a02f 100644 --- a/app/components/settings/project_phase_definitions/index_component.rb +++ b/app/components/settings/project_phase_definitions/index_component.rb @@ -47,8 +47,8 @@ module Settings def drop_target_config { - "is-drag-and-drop-target": true, - "target-container-accessor": "& > ul", + generic_drag_and_drop_target: "container", + "target-container-accessor": ":scope > ul", "target-allowed-drag-type": "life-cycle-step-definition" } end diff --git a/app/components/work_package_types/export_template_list_component.rb b/app/components/work_package_types/export_template_list_component.rb index ace1a352c41..1f2fb7ca71b 100644 --- a/app/components/work_package_types/export_template_list_component.rb +++ b/app/components/work_package_types/export_template_list_component.rb @@ -48,8 +48,8 @@ module WorkPackageTypes def drag_and_drop_target_config { - "is-drag-and-drop-target": true, - "target-container-accessor": "& > ul", + generic_drag_and_drop_target: "container", + "target-container-accessor": ":scope > ul", "target-allowed-drag-type": "template", test_selector: "pdf-export-template-rows" } diff --git a/app/components/work_package_types/export_template_row_component.html.erb b/app/components/work_package_types/export_template_row_component.html.erb index de7dac1c92f..b2605b2a258 100644 --- a/app/components/work_package_types/export_template_row_component.html.erb +++ b/app/components/work_package_types/export_template_row_component.html.erb @@ -30,7 +30,7 @@ See COPYRIGHT and LICENSE files for more details. component_wrapper do flex_layout(align_items: :center) do |item_information| item_information.with_column(mr: 2) do - render(Primer::OpenProject::DragHandle.new(draggable: true)) + render(Primer::OpenProject::DragHandle.new) end item_information.with_column(flex: 1, flex_layout: true) do |title_container| title_container.with_column(pt: 1, mr: 2) do diff --git a/app/components/work_packages/activities_tab/index_component.html.erb b/app/components/work_packages/activities_tab/index_component.html.erb deleted file mode 100644 index eb5a69537fb..00000000000 --- a/app/components/work_packages/activities_tab/index_component.html.erb +++ /dev/null @@ -1,53 +0,0 @@ -<%= - if deferred - render( - WorkPackages::ActivitiesTab::Journals::IndexComponent.new(work_package:, filter:, deferred:) - ) - else - component_wrapper(tag: "turbo-frame") do - flex_layout(classes: "work-packages-activities-tab-index-component") do |activities_tab_wrapper_container| - activities_tab_wrapper_container.with_row(classes: "work-packages-activities-tab-index-component--errors") do - render( - WorkPackages::ActivitiesTab::ErrorStreamComponent.new - ) - end - - activities_tab_wrapper_container.with_row(id: index_content_wrapper_key, data: wrapper_data_attributes) do - flex_layout do |activities_tab_container| - activities_tab_container.with_row(mb: 2) do - render( - WorkPackages::ActivitiesTab::Journals::FilterAndSortingComponent.new( - work_package:, - filter: - ) - ) - end - - activities_tab_container.with_row(flex_layout: true, classes: "work-packages-activities-tab-index-component--content-container", mt: 3) do |journals_wrapper_container| - journals_wrapper_container.with_row( - classes: "work-packages-activities-tab-index-component--journals-container work-packages-activities-tab-index-component--journals-container_with-initial-input-compensation", - data: { "work-packages--activities-tab--index-target": "journalsContainer" } - ) do - render(list_journals_component) - end - - if adding_comment_allowed? - journals_wrapper_container.with_row( - id: add_comment_wrapper_key, - classes: "work-packages-activities-tab-index-component--input-container work-packages-activities-tab-index-component--input-container_sort-#{journal_sorting}", - p: 3, - bg: :subtle, - data: add_comment_wrapper_data_attributes - ) do - render( - WorkPackages::ActivitiesTab::Journals::NewComponent.new(work_package:, filter:, last_server_timestamp:) - ) - end - end - end - end - end - end - end - end -%> diff --git a/app/components/work_packages/activities_tab/index_component.rb b/app/components/work_packages/activities_tab/index_component.rb deleted file mode 100644 index c07a0ff50c0..00000000000 --- a/app/components/work_packages/activities_tab/index_component.rb +++ /dev/null @@ -1,129 +0,0 @@ -# frozen_string_literal: true - -# -- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -# ++ - -module WorkPackages - module ActivitiesTab - class IndexComponent < ApplicationComponent - include ApplicationHelper - include OpPrimer::ComponentHelpers - include OpTurbo::Streamable - include WorkPackages::ActivitiesTab::SharedHelpers - include WorkPackages::ActivitiesTab::StimulusControllers - - def initialize(work_package:, last_server_timestamp:, filter: :all, deferred: false) - super - - @work_package = work_package - @filter = filter - @last_server_timestamp = last_server_timestamp - @deferred = deferred - end - - def self.wrapper_key = "work-package-activities-tab-content" - def self.index_content_wrapper_key = WorkPackages::ActivitiesTab::StimulusControllers.index_stimulus_controller - def self.add_comment_wrapper_key = "work-packages-activities-tab-add-comment-component" - delegate :index_content_wrapper_key, :add_comment_wrapper_key, to: :class - - def list_journals_component - WorkPackages::ActivitiesTab::Journals::IndexComponent.new(work_package:, filter:) - end - - private - - attr_reader :work_package, :filter, :last_server_timestamp, :deferred - - def wrapper_data_attributes # rubocop:disable Metrics/AbcSize - stimulus_controllers = { - controller: [ - index_stimulus_controller, - polling_stimulus_controller, - editor_stimulus_controller, - auto_scrolling_stimulus_controller, - stems_stimulus_controller - ].join(" ") - } - stimulus_controller_values = { - editor_stimulus_controller("-unsaved-changes-confirmation-message-value") => unsaved_changes_confirmation_message, - index_stimulus_controller("-notification-center-path-name-value") => notifications_path, - index_stimulus_controller("-sorting-value") => journal_sorting, - index_stimulus_controller("-filter-value") => filter, - index_stimulus_controller("-user-id-value") => User.current.id, - index_stimulus_controller("-work-package-id-value") => work_package.id, - polling_stimulus_controller("-last-server-timestamp-value") => last_server_timestamp, - polling_stimulus_controller("-polling-interval-in-ms-value") => polling_interval, - polling_stimulus_controller("-show-conflict-flash-message-url-value") => show_conflict_flash_message_work_packages_path, - polling_stimulus_controller("-update-streams-path-value") => update_streams_work_package_activities_path(work_package) - } - stimulus_controller_outlets = { - editor_stimulus_controller("-#{auto_scrolling_stimulus_controller}-outlet") => index_component_dom_selector, - editor_stimulus_controller("-#{polling_stimulus_controller}-outlet") => index_component_dom_selector, - editor_stimulus_controller("-#{stems_stimulus_controller}-outlet") => index_component_dom_selector, - polling_stimulus_controller("-#{auto_scrolling_stimulus_controller}-outlet") => index_component_dom_selector, - polling_stimulus_controller("-#{stems_stimulus_controller}-outlet") => index_component_dom_selector - } - - { test_selector: "op-wp-activity-tab" } - .merge(stimulus_controllers) - .merge(stimulus_controller_values) - .merge(stimulus_controller_outlets) - end - - def add_comment_wrapper_data_attributes - { - test_selector: "op-work-package-journal--new-comment-component", - controller: internal_comment_stimulus_controller, - internal_comment_stimulus_controller("-target") => "formContainer", - action: editor_stimulus_controller(":onSubmit-end@window->#{internal_comment_stimulus_controller}#onSubmitEnd"), - internal_comment_stimulus_controller("-highlight-class") => "work-packages-activities-tab-journals-new-component--journal-notes-body__internal-comment", # rubocop:disable Layout/LineLength - internal_comment_stimulus_controller("-hidden-class") => "d-none", - internal_comment_stimulus_controller("-is-internal-value") => false, # Initial value - internal_comment_stimulus_controller("-#{editor_stimulus_controller}-outlet") => index_component_dom_selector - } - end - - def polling_interval - # Polling interval should only be adjustable in test environment - if Rails.env.test? - ENV["WORK_PACKAGES_ACTIVITIES_TAB_POLLING_INTERVAL_IN_MS"].presence || 10000 - else - 10000 - end - end - - def adding_comment_allowed? - User.current.allowed_in_work_package?(:add_work_package_comments, @work_package) - end - - def unsaved_changes_confirmation_message - I18n.t("activities.work_packages.activity_tab.unsaved_changes_confirmation_message") - end - end - end -end diff --git a/app/components/work_packages/activities_tab/journals/index_component.html.erb b/app/components/work_packages/activities_tab/journals/index_component.html.erb deleted file mode 100644 index 1258305bf19..00000000000 --- a/app/components/work_packages/activities_tab/journals/index_component.html.erb +++ /dev/null @@ -1,76 +0,0 @@ -<%= - if deferred - helpers.turbo_frame_tag("work-package-activities-tab-content-older-journals") do - flex_layout do |older_journals_container| - older_journals.each do |record| - older_journals_container.with_row do - if record.is_a?(Changeset) - render(WorkPackages::ActivitiesTab::Journals::RevisionComponent.new(changeset: record, filter:)) - else - render( - WorkPackages::ActivitiesTab::Journals::ItemComponent.new( - journal: record, filter:, - grouped_emoji_reactions: wp_journals_grouped_emoji_reactions[record.id] - ) - ) - end - end - end - end - end - else - component_wrapper(class: "work-packages-activities-tab-journals-index-component") do - flex_layout(data: { test_selector: "op-wp-journals-#{filter}-#{journal_sorting}" }) do |journals_index_wrapper_container| - journals_index_wrapper_container.with_row( - classes: "work-packages-activities-tab-journals-index-component--journals-inner-container", - mb: inner_container_margin_bottom - ) do - flex_layout( - id: insert_target_modifier_id, - data: { test_selector: "op-wp-journals-container" } - ) do |journals_index_container| - if empty_state? - journals_index_container.with_row(mt: 2, mb: 3) do - render( - WorkPackages::ActivitiesTab::Journals::EmptyComponent.new - ) - end - end - - if !journal_sorting.desc? && journals.count > MAX_RECENT_JOURNALS - journals_index_container.with_row do - helpers.turbo_frame_tag("work-package-activities-tab-content-older-journals", src: work_package_activities_path(work_package, filter:, deferred: true)) - end - end - - recent_journals.each do |record| - journals_index_container.with_row do - if record.is_a?(Changeset) - render(WorkPackages::ActivitiesTab::Journals::RevisionComponent.new(changeset: record, filter:)) - else - render( - WorkPackages::ActivitiesTab::Journals::ItemComponent.new( - journal: record, filter:, - grouped_emoji_reactions: wp_journals_grouped_emoji_reactions[record.id] - ) - ) - end - end - end - - if journal_sorting.desc? && journals.count > MAX_RECENT_JOURNALS - journals_index_container.with_row do - helpers.turbo_frame_tag("work-package-activities-tab-content-older-journals", src: work_package_activities_path(work_package, filter:, deferred: true)) - end - end - end - end - - unless empty_state? - journals_index_wrapper_container - .with_row(classes: "work-packages-activities-tab-journals-index-component--stem-connection") - end - end - end - end -%> diff --git a/app/components/work_packages/activities_tab/journals/index_component.rb b/app/components/work_packages/activities_tab/journals/index_component.rb deleted file mode 100644 index 2b31a1a7032..00000000000 --- a/app/components/work_packages/activities_tab/journals/index_component.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -# -- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -# ++ - -module WorkPackages - module ActivitiesTab - module Journals - class IndexComponent < ApplicationComponent - MAX_RECENT_JOURNALS = 30 - - include ApplicationHelper - include OpPrimer::ComponentHelpers - include OpTurbo::Streamable - include WorkPackages::ActivitiesTab::SharedHelpers - - def initialize(work_package:, filter: :all, deferred: false) - super - - @work_package = work_package - @filter = filter - @deferred = deferred - end - - private - - attr_reader :work_package, :filter, :deferred - - def insert_target_modified? - true - end - - def insert_target_modifier_id - "work-package-journal-days" - end - - def base_journals - combine_and_sort_records(fetch_journals, fetch_revisions) - end - - def fetch_journals - API::V3::Activities::ActivityEagerLoadingWrapper.wrap( - work_package - .journals - .internal_visible - .includes(:user, :customizable_journals, :attachable_journals, :storable_journals, :notifications) - .reorder(version: journal_sorting) - .with_sequence_version - ) - end - - def fetch_revisions - work_package.changesets.includes(:user, :repository) - end - - def combine_and_sort_records(journals, revisions) - (journals + revisions).sort_by do |record| - timestamp = record_timestamp(record) - journal_sorting.desc? ? [-timestamp, -record.id] : [timestamp, record.id] - end - end - - def record_timestamp(record) - if record.is_a?(API::V3::Activities::ActivityEagerLoadingWrapper) - record.created_at&.to_i - elsif record.is_a?(Changeset) - record.committed_on.to_i - end - end - - def journals - base_journals - end - - def recent_journals - if journal_sorting.desc? - base_journals.first(MAX_RECENT_JOURNALS) - else - base_journals.last(MAX_RECENT_JOURNALS) - end - end - - def older_journals - if journal_sorting.desc? - base_journals.drop(MAX_RECENT_JOURNALS) - else - base_journals.take(base_journals.size - MAX_RECENT_JOURNALS) - end - end - - def journal_with_notes - work_package - .journals - .where.not(notes: "") - end - - def wp_journals_grouped_emoji_reactions - @wp_journals_grouped_emoji_reactions ||= - EmojiReactions::GroupedQueries.grouped_work_package_journals_emoji_reactions_by_reactable(work_package) - end - - def empty_state? - filter == :only_comments && journal_with_notes.empty? - end - - def inner_container_margin_bottom - if journal_sorting.desc? - 3 - else - 0 - end - end - end - end - end -end diff --git a/app/components/work_packages/activities_tab/journals/lazy_index_component.rb b/app/components/work_packages/activities_tab/journals/lazy_index_component.rb index 71bc21ca435..71a2c038f66 100644 --- a/app/components/work_packages/activities_tab/journals/lazy_index_component.rb +++ b/app/components/work_packages/activities_tab/journals/lazy_index_component.rb @@ -31,12 +31,19 @@ module WorkPackages module ActivitiesTab module Journals - class LazyIndexComponent < IndexComponent - def initialize(work_package:, journals:, paginator:, filter: :all) - super(work_package:, filter:, deferred: false) + class LazyIndexComponent < ApplicationComponent + include ApplicationHelper + include OpPrimer::ComponentHelpers + include OpTurbo::Streamable + include WorkPackages::ActivitiesTab::SharedHelpers + def initialize(work_package:, journals:, paginator:, filter: :all) + super + + @work_package = work_package @journals = journals @paginator = paginator + @filter = filter end def pages @@ -67,11 +74,30 @@ module WorkPackages private - attr_reader :journals, :paginator + attr_reader :work_package, :journals, :paginator, :filter def insert_target_modified? true end + + def empty_state? + filter == :only_comments && journal_with_notes.empty? + end + + def wp_journals_grouped_emoji_reactions + @wp_journals_grouped_emoji_reactions ||= + EmojiReactions::GroupedQueries.grouped_work_package_journals_emoji_reactions_by_reactable(work_package) + end + + def inner_container_margin_bottom + journal_sorting.desc? ? 3 : 0 + end + + def journal_with_notes + work_package + .journals + .where.not(notes: "") + end end end end diff --git a/app/components/work_packages/activities_tab/journals/new_component.html.erb b/app/components/work_packages/activities_tab/journals/new_component.html.erb index b2b54cefd3b..6ad05aa77cf 100644 --- a/app/components/work_packages/activities_tab/journals/new_component.html.erb +++ b/app/components/work_packages/activities_tab/journals/new_component.html.erb @@ -78,10 +78,8 @@ data: { "#{internal_comment_stimulus_controller}-target": "learnMoreLink" }, pb: 1 ) do - render(Primer::Beta::Link.new(href: learn_more_static_link_url, target: "_blank")) do |link| - link.with_trailing_visual_icon(icon: "link-external", size: :small) - I18n.t("label_learn_more") - end + helpers.static_link_to(:enterprise_features, :internal_comments, + label: I18n.t(:label_learn_more)) end end end diff --git a/app/components/work_packages/activities_tab/lazy_index_component.html.erb b/app/components/work_packages/activities_tab/lazy_index_component.html.erb new file mode 100644 index 00000000000..173bf42aaa4 --- /dev/null +++ b/app/components/work_packages/activities_tab/lazy_index_component.html.erb @@ -0,0 +1,47 @@ +<%= + component_wrapper(tag: "turbo-frame") do + flex_layout(classes: "work-packages-activities-tab-index-component") do |activities_tab_wrapper_container| + activities_tab_wrapper_container.with_row(classes: "work-packages-activities-tab-index-component--errors") do + render( + WorkPackages::ActivitiesTab::ErrorStreamComponent.new + ) + end + + activities_tab_wrapper_container.with_row(id: index_content_wrapper_key, data: wrapper_data_attributes) do + flex_layout do |activities_tab_container| + activities_tab_container.with_row(mb: 2) do + render( + WorkPackages::ActivitiesTab::Journals::FilterAndSortingComponent.new( + work_package:, + filter: + ) + ) + end + + activities_tab_container.with_row(flex_layout: true, classes: "work-packages-activities-tab-index-component--content-container", mt: 3) do |journals_wrapper_container| + journals_wrapper_container.with_row( + classes: "work-packages-activities-tab-index-component--journals-container work-packages-activities-tab-index-component--journals-container_with-initial-input-compensation", + data: { "work-packages--activities-tab--index-target": "journalsContainer" } + ) do + render(list_journals_component) + end + + if adding_comment_allowed? + journals_wrapper_container.with_row( + id: add_comment_wrapper_key, + classes: "work-packages-activities-tab-index-component--input-container work-packages-activities-tab-index-component--input-container_sort-#{journal_sorting}", + p: 3, + bg: :subtle, + data: add_comment_wrapper_data_attributes + ) do + render( + WorkPackages::ActivitiesTab::Journals::NewComponent.new(work_package:, filter:, last_server_timestamp:) + ) + end + end + end + end + end + end + end +%> diff --git a/app/components/work_packages/activities_tab/lazy_index_component.rb b/app/components/work_packages/activities_tab/lazy_index_component.rb index fc46e47a369..0eebbf48551 100644 --- a/app/components/work_packages/activities_tab/lazy_index_component.rb +++ b/app/components/work_packages/activities_tab/lazy_index_component.rb @@ -30,14 +30,28 @@ module WorkPackages module ActivitiesTab - class LazyIndexComponent < IndexComponent - def initialize(work_package:, journals:, paginator:, last_server_timestamp:, filter: :all) - super(work_package:, last_server_timestamp:, filter:, deferred: false) + class LazyIndexComponent < ApplicationComponent + include ApplicationHelper + include OpPrimer::ComponentHelpers + include OpTurbo::Streamable + include WorkPackages::ActivitiesTab::SharedHelpers + include WorkPackages::ActivitiesTab::StimulusControllers + def initialize(work_package:, journals:, paginator:, last_server_timestamp:, filter: :all) + super + + @work_package = work_package @journals = journals @paginator = paginator + @last_server_timestamp = last_server_timestamp + @filter = filter end + def self.wrapper_key = "work-package-activities-tab-content" + def self.index_content_wrapper_key = WorkPackages::ActivitiesTab::StimulusControllers.index_stimulus_controller + def self.add_comment_wrapper_key = "work-packages-activities-tab-add-comment-component" + delegate :index_content_wrapper_key, :add_comment_wrapper_key, to: :class + def list_journals_component WorkPackages::ActivitiesTab::Journals::LazyIndexComponent .new(work_package:, journals:, filter:, paginator:) @@ -45,7 +59,73 @@ module WorkPackages private - attr_reader :journals, :paginator + attr_reader :work_package, :journals, :paginator, :filter, :last_server_timestamp + + def wrapper_data_attributes # rubocop:disable Metrics/AbcSize + stimulus_controllers = { + controller: [ + index_stimulus_controller, + polling_stimulus_controller, + editor_stimulus_controller, + auto_scrolling_stimulus_controller, + stems_stimulus_controller + ].join(" ") + } + stimulus_controller_values = { + editor_stimulus_controller("-unsaved-changes-confirmation-message-value") => unsaved_changes_confirmation_message, + index_stimulus_controller("-notification-center-path-name-value") => notifications_path, + index_stimulus_controller("-sorting-value") => journal_sorting, + index_stimulus_controller("-filter-value") => filter, + index_stimulus_controller("-user-id-value") => User.current.id, + index_stimulus_controller("-work-package-id-value") => work_package.id, + polling_stimulus_controller("-last-server-timestamp-value") => last_server_timestamp, + polling_stimulus_controller("-polling-interval-in-ms-value") => polling_interval, + polling_stimulus_controller("-show-conflict-flash-message-url-value") => show_conflict_flash_message_work_packages_path, + polling_stimulus_controller("-update-streams-path-value") => update_streams_work_package_activities_path(work_package) + } + stimulus_controller_outlets = { + editor_stimulus_controller("-#{auto_scrolling_stimulus_controller}-outlet") => index_component_dom_selector, + editor_stimulus_controller("-#{polling_stimulus_controller}-outlet") => index_component_dom_selector, + editor_stimulus_controller("-#{stems_stimulus_controller}-outlet") => index_component_dom_selector, + polling_stimulus_controller("-#{auto_scrolling_stimulus_controller}-outlet") => index_component_dom_selector, + polling_stimulus_controller("-#{stems_stimulus_controller}-outlet") => index_component_dom_selector + } + + { test_selector: "op-wp-activity-tab" } + .merge(stimulus_controllers) + .merge(stimulus_controller_values) + .merge(stimulus_controller_outlets) + end + + def add_comment_wrapper_data_attributes + { + test_selector: "op-work-package-journal--new-comment-component", + controller: internal_comment_stimulus_controller, + internal_comment_stimulus_controller("-target") => "formContainer", + action: editor_stimulus_controller(":onSubmit-end@window->#{internal_comment_stimulus_controller}#onSubmitEnd"), + internal_comment_stimulus_controller("-highlight-class") => "work-packages-activities-tab-journals-new-component--journal-notes-body__internal-comment", # rubocop:disable Layout/LineLength + internal_comment_stimulus_controller("-hidden-class") => "d-none", + internal_comment_stimulus_controller("-is-internal-value") => false, # Initial value + internal_comment_stimulus_controller("-#{editor_stimulus_controller}-outlet") => index_component_dom_selector + } + end + + def polling_interval + # Polling interval should only be adjustable in test environment + if Rails.env.test? + ENV["WORK_PACKAGES_ACTIVITIES_TAB_POLLING_INTERVAL_IN_MS"].presence || 10000 + else + 10000 + end + end + + def adding_comment_allowed? + User.current.allowed_in_work_package?(:add_work_package_comments, @work_package) + end + + def unsaved_changes_confirmation_message + I18n.t("activities.work_packages.activity_tab.unsaved_changes_confirmation_message") + end end end end diff --git a/app/contracts/custom_fields/base_contract.rb b/app/contracts/custom_fields/base_contract.rb index d959804701b..88e7a2c385c 100644 --- a/app/contracts/custom_fields/base_contract.rb +++ b/app/contracts/custom_fields/base_contract.rb @@ -32,9 +32,14 @@ module CustomFields class BaseContract < ::ModelContract include RequiresAdminGuard + attribute :admin_only + attribute :allow_non_open_versions + attribute :content_right_to_left + attribute :custom_field_section_id + attribute :default_value attribute :editable - attribute :type attribute :field_format + attribute :formula attribute :is_filter attribute :is_for_all attribute :is_required do @@ -42,17 +47,12 @@ module CustomFields end attribute :max_length attribute :min_length + attribute :multi_value attribute :name attribute :possible_values attribute :regexp - attribute :formula attribute :searchable - attribute :admin_only - attribute :default_value - attribute :multi_value - attribute :content_right_to_left - attribute :custom_field_section_id - attribute :allow_non_open_versions + attribute :type def validate_non_true_for_some_formats return unless %w[bool calculated_value].include?(field_format) diff --git a/app/contracts/projects/create_artifact_work_package_contract.rb b/app/contracts/projects/create_artifact_work_package_contract.rb index 6098e45de32..453882647d0 100644 --- a/app/contracts/projects/create_artifact_work_package_contract.rb +++ b/app/contracts/projects/create_artifact_work_package_contract.rb @@ -69,9 +69,9 @@ module Projects end def validate_assignee_custom_field - if project_assignee_custom_field_not_configured? - add_error :project_creation_wizard_assignee_custom_field_id, :blank - elsif not_allowed_to_read_assignee_custom_field_value? + return if project_assignee_custom_field_not_configured? + + if not_allowed_to_read_assignee_custom_field_value? add_error assignee_custom_field.attribute_name, :unauthorized elsif missing_assignee_custom_field_value? add_error assignee_custom_field.attribute_name, :blank diff --git a/app/contracts/projects/settings_contract.rb b/app/contracts/projects/settings_contract.rb index a9155142497..4b5ffa72075 100644 --- a/app/contracts/projects/settings_contract.rb +++ b/app/contracts/projects/settings_contract.rb @@ -52,7 +52,6 @@ module Projects validate_work_package_type validate_status_when_submitted validate_assignee_custom_field - validate_work_package_comment validate_notification_text end @@ -78,21 +77,13 @@ module Projects end def validate_assignee_custom_field - if model.project_creation_wizard_assignee_custom_field_id.blank? - errors.add :project_creation_wizard_assignee_custom_field_id, :blank - else - valid_custom_field = model.available_custom_fields - .where(field_format: "user", multi_value: false) - .exists?(id: model.project_creation_wizard_assignee_custom_field_id) - unless valid_custom_field - errors.add :project_creation_wizard_assignee_custom_field_id, :inclusion - end - end - end + return if model.project_creation_wizard_assignee_custom_field_id.blank? - def validate_work_package_comment - if model.project_creation_wizard_work_package_comment.blank? - errors.add :project_creation_wizard_work_package_comment, :blank + valid_custom_field = model.available_custom_fields + .where(field_format: "user", multi_value: false) + .exists?(id: model.project_creation_wizard_assignee_custom_field_id) + unless valid_custom_field + errors.add :project_creation_wizard_assignee_custom_field_id, :inclusion end end diff --git a/app/contracts/users/base_contract.rb b/app/contracts/users/base_contract.rb index a5e9f08bb86..08015bb0241 100644 --- a/app/contracts/users/base_contract.rb +++ b/app/contracts/users/base_contract.rb @@ -38,7 +38,8 @@ module Users } attribute :firstname attribute :lastname - attribute :mail + attribute :mail, + writable: ->(*) { model.new_record? || model.id == user.id || user.admin? } attribute :admin, writable: ->(*) { user.admin? && model.id != user.id } attribute :language diff --git a/app/contracts/work_packages/create_note_contract.rb b/app/contracts/work_packages/create_note_contract.rb index f4c9db290a2..937cc1030c0 100644 --- a/app/contracts/work_packages/create_note_contract.rb +++ b/app/contracts/work_packages/create_note_contract.rb @@ -45,6 +45,10 @@ module WorkPackages errors.add(:journal_internal, :enterprise_plan_required, plan_name:) end + unless model.project.enabled_internal_comments + errors.add(:journal_internal, :feature_disabled_for_project) + end + unless allowed_in_project?(:add_internal_comments) errors.add(:journal_internal, :error_unauthorized) end diff --git a/app/controllers/admin/mcp_configurations_controller.rb b/app/controllers/admin/mcp_configurations_controller.rb new file mode 100644 index 00000000000..7388c986e77 --- /dev/null +++ b/app/controllers/admin/mcp_configurations_controller.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Admin + class McpConfigurationsController < ::ApplicationController + include OpTurbo::ComponentStream + + before_action :require_admin + + menu_item :mcp_configurations + + layout "admin" + + def index + @server_config = McpConfiguration.server_config + @tool_configs = McpConfiguration.where(identifier: McpTools.tools_by_name.keys) + + @resource_configs = McpConfiguration.where(identifier: McpResources.resources_by_name.keys) + end + + def update + config = McpConfiguration.find(params[:id]) + if config.update(mcp_config_params) + flash[:notice] = t(".success") + else + flash[:error] = t(".failure") + end + + redirect_to action: :index + end + + def multi_update + updates = params[:mcp_configurations] + updates.transform_values! { |hash| hash.permit(:title, :description, :enabled) } + + updates.each do |identifier, attributes| + McpConfiguration.find_by!(identifier:).update!(attributes) + end + + flash[:notice] = t(".success") + redirect_to action: :index + end + + private + + def mcp_config_params + params.expect(mcp_configuration: %i[enabled title description]) + end + end +end diff --git a/app/controllers/admin/settings/api_settings_controller.rb b/app/controllers/admin/settings/api_settings_controller.rb index 151e88966cb..dd789dbc3c7 100644 --- a/app/controllers/admin/settings/api_settings_controller.rb +++ b/app/controllers/admin/settings/api_settings_controller.rb @@ -34,7 +34,7 @@ module Admin::Settings def settings_params super.tap do |settings| - settings["apiv3_cors_origins"] = settings["apiv3_cors_origins"].split(/\r?\n/) + settings["apiv3_cors_origins"] = settings["apiv3_cors_origins"]&.split(/\r?\n/) || [] end end diff --git a/app/components/projects/export_list_modal_component.rb b/app/controllers/admin/settings/external_links_settings_controller.rb similarity index 87% rename from app/components/projects/export_list_modal_component.rb rename to app/controllers/admin/settings/external_links_settings_controller.rb index 28085a486ff..2ace5c36026 100644 --- a/app/components/projects/export_list_modal_component.rb +++ b/app/controllers/admin/settings/external_links_settings_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# -- copyright +#-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH # @@ -26,11 +26,10 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. -# ++ +#++ -class Projects::ExportListModalComponent < ApplicationComponent - include OpTurbo::Streamable - MODAL_ID = "op-project-list-export-dialog" - - options :query +module Admin::Settings + class ExternalLinksSettingsController < ::Admin::SettingsController + menu_item :settings_external_links + end end diff --git a/app/controllers/admin/settings/mail_notifications_settings_controller.rb b/app/controllers/admin/settings/mail_notifications_settings_controller.rb index 422c10d3cae..35854490675 100644 --- a/app/controllers/admin/settings/mail_notifications_settings_controller.rb +++ b/app/controllers/admin/settings/mail_notifications_settings_controller.rb @@ -45,6 +45,7 @@ module Admin::Settings private def validate_mail_from + return unless settings_params.key?(:mail_from) return if EmailValidator.valid?(settings_params[:mail_from]) flash[:error] = "#{I18n.t(:setting_mail_from)} #{I18n.t('activerecord.errors.messages.email')}" diff --git a/app/controllers/api_docs_controller.rb b/app/controllers/api_docs_controller.rb index 703053f05d3..084fee2f722 100644 --- a/app/controllers/api_docs_controller.rb +++ b/app/controllers/api_docs_controller.rb @@ -29,12 +29,19 @@ #++ class APIDocsController < ApplicationController - before_action :require_login + before_action :require_login, + :check_if_api_docs_enabled no_authorization_required! :index helper API::APIDocsHelper def index + render locals: { turbo_opt_out: true } + end + + private + + def check_if_api_docs_enabled render_404 unless Setting.apiv3_docs_enabled? end end diff --git a/app/controllers/external_link_warning_controller.rb b/app/controllers/external_link_warning_controller.rb new file mode 100644 index 00000000000..281e23ebb58 --- /dev/null +++ b/app/controllers/external_link_warning_controller.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class ExternalLinkWarningController < ApplicationController + layout "only_logo" + + skip_before_action :check_if_login_required + no_authorization_required! :show + + before_action :parse_external_url, only: [:show] + before_action :verify_capture_enabled, only: [:show] + + def show; end + + private + + def verify_capture_enabled + unless capture_enabled? + redirect_to @external_url, allow_other_host: true, status: :see_other + end + end + + def capture_enabled? + Setting.capture_external_links? && EnterpriseToken.allows_to?(:capture_external_links) + end + + def parse_external_url + external_url = params[:url] + @external_url = parse_url(CGI.unescape(external_url)) if external_url.present? + + if @external_url.nil? + redirect_to home_path, status: :see_other + end + end + + def parse_url(url) + return nil if url.blank? + + uri = URI.parse(url) + return url if uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS) + + nil + rescue URI::InvalidURIError + nil + end +end diff --git a/app/controllers/my/access_tokens_controller.rb b/app/controllers/my/access_tokens_controller.rb index b0e5cb3389e..65a32670f4f 100644 --- a/app/controllers/my/access_tokens_controller.rb +++ b/app/controllers/my/access_tokens_controller.rb @@ -48,9 +48,9 @@ module My :generate_rss_key, :revoke_rss_key, :generate_api_key, + :remove_oauth_client_token, :revoke_api_key, :revoke_ical_token, - :revoke_storage_token, :revoke_ical_meeting_token def dialog @@ -58,39 +58,30 @@ module My end def index - @ical_meeting_tokens = current_user.ical_meeting_tokens - - @storage_tokens = OAuthClientToken - .preload(:oauth_client) - .joins(:oauth_client) - .where(user: @user, oauth_client: { integration_type: "Storages::Storage" }) + @oauth_client_tokens = OAuthClientToken.includes(:oauth_client).where(user: @user) end - def revoke_storage_token - token = OAuthClientToken - .preload(:oauth_client) - .joins(:oauth_client) - .where(user: @user, oauth_client: { integration_type: "Storages::Storage" }).find_by(id: params[:access_token_id]) + def remove_oauth_client_token + token = OAuthClientToken.includes(:oauth_client).where(user: @user).find_by(id: params[:access_token_id]) if token&.destroy - flash[:info] = I18n.t("my_account.access_tokens.storages.removed") + flash[:info] = I18n.t("my_account.access_tokens.oauth_client.removed") else - flash[:error] = I18n.t("my_account.access_tokens.storages.failed") + flash[:error] = I18n.t("my_account.access_tokens.oauth_client.failed") end - redirect_to action: :index, status: :see_other + redirect_to action: :index, tab: :client, status: :see_other end def generate_rss_key # rubocop:disable Metrics/AbcSize token = Token::RSS.create!(user: current_user) - flash[:info] = [ - t("my.access_token.notice_reset_token", type: "RSS").html_safe, - helpers.content_tag(:strong, helpers.content_tag(:code, token.plain_value)), - t("my.access_token.token_value_warning") - ] + + update_via_turbo_stream( + component: My::AccessToken::APITokensSectionComponent.new(tokens: [token], token_type: Token::RSS) + ) + respond_with_dialog(My::AccessToken::AccessTokenCreatedDialogComponent.new(token:)) rescue StandardError => e Rails.logger.error "Failed to reset user ##{current_user.id} RSS key: #{e}" flash[:error] = t("my.access_token.failed_to_reset_token", error: e.message) - ensure redirect_to action: :index, status: :see_other end diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 69b881e023f..d34e28ef90d 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -48,6 +48,7 @@ class MyController < ApplicationController :update_settings, :password, :change_password, + :password_confirmation_dialog, :notifications, :reminders @@ -85,6 +86,10 @@ class MyController < ApplicationController end end + def password_confirmation_dialog + respond_with_dialog My::PasswordConfirmationDialog.new + end + # Configure user's in app notifications def notifications; end diff --git a/app/controllers/oauth_metadata_controller.rb b/app/controllers/oauth_metadata_controller.rb new file mode 100644 index 00000000000..eda5ca00336 --- /dev/null +++ b/app/controllers/oauth_metadata_controller.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class OAuthMetadataController < ApplicationController + no_authorization_required! :authorization_server, :protected_resource + + skip_before_action :check_if_login_required + + def authorization_server + grant_types = Doorkeeper.configuration.grant_flows + grant_types += ["refresh_token"] if Doorkeeper.configuration.refresh_token_enabled? + render json: { + issuer: local_issuer, + authorization_endpoint: oauth_authorization_url, + token_endpoint: oauth_token_url, + introspection_endpoint: oauth_introspect_url, + scopes_supported: Doorkeeper.configuration.scopes.to_a, + response_types_supported: response_types(Doorkeeper.configuration.grant_flows), + grant_types_supported: grant_types, + service_documentation: OpenProject::Static::Links.url_for(:oauth_applications) + } + end + + def protected_resource + render json: { + resource: resource_url, + resource_name: Setting.app_title, + authorization_servers:, + scopes_supported: OpenProject::Authentication::Scope.values, + bearer_methods_supported: ["header"], + resource_documentation: OpenProject::Static::Links.url_for(:api_docs) + } + end + + private + + def response_types(grant_types) + grant_types.filter_map do |grant| + case grant + when "authorization_code" + "code" + when "implicit" + "token" + end + end + end + + def authorization_servers + OpenIDConnect::Provider.where(available: true).map(&:issuer) + [local_issuer] + end + + def instance_base_url + "http#{'s' if request.ssl?}://#{Setting.host_name}" + end + + alias resource_url instance_base_url + + alias local_issuer instance_base_url +end diff --git a/app/controllers/projects/settings/creation_wizard_controller.rb b/app/controllers/projects/settings/creation_wizard_controller.rb index 43e1da54422..0f8f8143e57 100644 --- a/app/controllers/projects/settings/creation_wizard_controller.rb +++ b/app/controllers/projects/settings/creation_wizard_controller.rb @@ -33,7 +33,8 @@ class Projects::Settings::CreationWizardController < Projects::SettingsControlle menu_item :settings_creation_wizard - before_action :check_feature_flag + before_action :check_enterprise_plan, only: :toggle + before_action :check_activation_conditions, only: :toggle def show; end @@ -71,11 +72,10 @@ class Projects::Settings::CreationWizardController < Projects::SettingsControlle end def toggle_project_custom_field - mapping = ProjectCustomFieldProjectMapping.find_by( - project_id: permitted_params.project_custom_field_project_mapping[:project_id], - custom_field_id: permitted_params.project_custom_field_project_mapping[:custom_field_id] - ) - if mapping&.update(creation_wizard: !mapping.creation_wizard) + cf = ProjectCustomField.find(permitted_params.project_custom_field_project_mapping[:custom_field_id]) + mapping = cf.project_custom_field_project_mappings.find_by(project: @project) + + if custom_field_toggleable?(cf) && toggle_mapping(mapping) render json: {}, status: :ok else render json: {}, status: :unprocessable_entity @@ -92,22 +92,65 @@ class Projects::Settings::CreationWizardController < Projects::SettingsControlle private + def check_enterprise_plan + # Allow disabling even without enterprise plan + return if @project.project_creation_wizard_enabled + + unless EnterpriseToken.allows_to?(:project_creation_wizard) + flash[:error] = I18n.t(:notice_requires_enterprise_token) + redirect_to project_settings_creation_wizard_path(@project, tab: "attributes"), status: :see_other + end + end + + def check_activation_conditions + # Allow disabling even without activation conditions met + return if @project.project_creation_wizard_enabled + + error = if @project.project_creation_wizard_default_work_package_type.nil? + I18n.t("projects.settings.creation_wizard.errors.no_work_package_type") + elsif @project.project_creation_wizard_default_status_when_submitted.nil? + type = @project.project_creation_wizard_default_work_package_type.name + I18n.t("projects.settings.creation_wizard.errors.no_status_when_submitted", type:) + end + + if error + flash[:error] = error + redirect_to project_settings_creation_wizard_path(@project, tab: params[:tab]), status: :see_other + end + end + def update_section_mappings(value) section_id = permitted_params.project_custom_field_project_mapping[:custom_field_section_id] - project_id = permitted_params.project_custom_field_project_mapping[:project_id] - custom_field_ids = ProjectCustomField - .where(custom_field_section_id: section_id) - .where(is_required: false) - .pluck(:id) + cf_ids_to_toggle, force_enabled_cf_ids = ProjectCustomField.toggleable_ids_in_creation_wizard_settings(@project, section_id) ProjectCustomFieldProjectMapping - .where(project_id:, custom_field_id: custom_field_ids) + .where(project_id: @project.id, custom_field_id: cf_ids_to_toggle) .update_all(creation_wizard: value) + enable_creation_wizard!(force_enabled_cf_ids) + redirect_to project_settings_creation_wizard_path(@project, tab: "attributes"), status: :see_other end + def enable_creation_wizard!(custom_field_ids) + ProjectCustomFieldProjectMapping + .where(project_id: @project.id, custom_field_id: custom_field_ids) + .update_all(creation_wizard: true) + end + + def custom_field_toggleable?(custom_field) + toggleable_ids = ProjectCustomField + .toggleable_ids_in_creation_wizard_settings(@project, custom_field.custom_field_section_id) + .first + + toggleable_ids.include?(custom_field.id) + end + + def toggle_mapping(mapping) + mapping&.update(creation_wizard: !mapping.creation_wizard) + end + def check_feature_flag unless OpenProject::FeatureDecisions.project_initiation_active? render_404 diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3b63b34e73e..bb62d32a288 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -34,10 +34,10 @@ class ProjectsController < ApplicationController menu_item :overview menu_item :roadmap, only: :roadmap - before_action :find_project, except: %i[index new create export_list_modal] - before_action :load_query_or_deny_access, only: %i[index export_list_modal] + before_action :find_project, except: %i[index new create] + before_action :load_query_or_deny_access, only: %i[index] before_action :authorize, - only: %i[copy_form copy deactivate_work_package_attachments export_list_modal export_project_initiation_pdf] + only: %i[copy_form copy deactivate_work_package_attachments export_project_initiation_pdf] before_action :authorize_global, only: %i[new create] before_action :require_admin, only: %i[destroy destroy_info] before_action :find_optional_parent, only: :new @@ -172,10 +172,6 @@ class ProjectsController < ApplicationController end end - def export_list_modal - respond_with_dialog Projects::ExportListModalComponent.new(query: @query) - end - def export_project_initiation_pdf export = Project::PDFExport::ProjectInitiation.new(@project).export! send_data(export.content, type: export.mime_type, filename: export.title) diff --git a/app/controllers/work_packages/activities_tab_controller.rb b/app/controllers/work_packages/activities_tab_controller.rb index 4f5fa502eb6..c93c1c22f38 100644 --- a/app/controllers/work_packages/activities_tab_controller.rb +++ b/app/controllers/work_packages/activities_tab_controller.rb @@ -39,29 +39,19 @@ class WorkPackages::ActivitiesTabController < ApplicationController before_action :find_journal, only: %i[emoji_actions item_actions edit cancel_edit update toggle_reaction] before_action :set_filter before_action :authorize - before_action :initialize_pagination, only: %i[page_streams] + before_action :initialize_pagination, only: %i[index page_streams] def index - index_component = - if OpenProject::FeatureDecisions.wp_activity_tab_lazy_pagination_active? - initialize_pagination - WorkPackages::ActivitiesTab::LazyIndexComponent.new( - work_package: @work_package, - journals: @paginated_journals, - paginator: @paginator, - filter: @filter, - last_server_timestamp: get_current_server_timestamp - ) - else - WorkPackages::ActivitiesTab::IndexComponent.new( - work_package: @work_package, - filter: @filter, - last_server_timestamp: get_current_server_timestamp, - deferred: ActiveRecord::Type::Boolean.new.cast(params[:deferred]) - ) - end - - render(index_component, layout: false) + render( + WorkPackages::ActivitiesTab::LazyIndexComponent.new( + work_package: @work_package, + journals: @paginated_journals, + paginator: @paginator, + filter: @filter, + last_server_timestamp: get_current_server_timestamp + ), + layout: false + ) end def page_streams @@ -323,37 +313,28 @@ class WorkPackages::ActivitiesTabController < ApplicationController end def replace_whole_tab - component = - if OpenProject::FeatureDecisions.wp_activity_tab_lazy_pagination_active? - initialize_pagination # re-initialize pagination to pick up changes to sorting/filtering - WorkPackages::ActivitiesTab::LazyIndexComponent.new( - work_package: @work_package, - journals: @paginated_journals, - paginator: @paginator, - filter: @filter, - last_server_timestamp: get_current_server_timestamp - ) - else - WorkPackages::ActivitiesTab::IndexComponent.new( - work_package: @work_package, - filter: @filter, - last_server_timestamp: get_current_server_timestamp - ) - end - replace_via_turbo_stream(component:) + initialize_pagination # re-initialize pagination to pick up changes to sorting/filtering + replace_via_turbo_stream( + component: WorkPackages::ActivitiesTab::LazyIndexComponent.new( + work_package: @work_package, + journals: @paginated_journals, + paginator: @paginator, + filter: @filter, + last_server_timestamp: get_current_server_timestamp + ) + ) end def update_index_component - component = - if OpenProject::FeatureDecisions.wp_activity_tab_lazy_pagination_active? - initialize_pagination # re-initialize pagination to pick up changes to sorting/filtering - WorkPackages::ActivitiesTab::Journals::LazyIndexComponent - .new(work_package: @work_package, journals: @paginated_journals, paginator: @paginator, filter: @filter) - else - WorkPackages::ActivitiesTab::Journals::IndexComponent - .new(work_package: @work_package, filter: @filter) - end - update_via_turbo_stream(component:) + initialize_pagination # re-initialize pagination to pick up changes to sorting/filtering + update_via_turbo_stream( + component: WorkPackages::ActivitiesTab::Journals::LazyIndexComponent.new( + work_package: @work_package, + journals: @paginated_journals, + paginator: @paginator, + filter: @filter + ) + ) end def create_journal_service_call @@ -421,56 +402,27 @@ class WorkPackages::ActivitiesTabController < ApplicationController end def rerender_journals_with_updated_notification(journals, last_update_timestamp, grouped_emoji_reactions, editing_journals) - # Case: the user marked the journal as read somewhere else and expects the bubble to disappear - # - # below code stopped working with the introduction of the sequence_version query - # I believe it is due to the fact that the notification join does not work well with the sequence_version query - # see below comments from my debugging session - # journals - # .joins(:notifications) - # .where("notifications.updated_at > ?", last_update_timestamp) - # .find_each do |journal| - # # DEBUGGING: - # # the journal id is actually 85 but below data is logged: - # # # journal id 14 (?!) - # # # journal sequence_version 22 (correct!) - # # the update stream has a wrong target then! - # # target="work-packages-activities-tab-journals-item-component-14" - # # instead of - # # target="work-packages-activities-tab-journals-item-component-85" - # update_item_show_component(journal:, grouped_emoji_reactions: grouped_emoji_reactions.fetch(journal.id, {})) - # end - # - # alternative approach in order to bypass the notification join issue in relation with the sequence_version query Notification .where(journal_id: journals.pluck(:id)) .where(recipient_id: User.current.id) .where("notifications.updated_at > ?", last_update_timestamp) .find_each do |notification| - next if editing_journals.include?(notification.journal_id) + next if editing_journals.include?(notification.journal_id) - update_item_show_component( - journal: journals.find(notification.journal_id), # take the journal from the journals querried with sequence_version! - grouped_emoji_reactions: grouped_emoji_reactions.fetch(notification.journal_id, {}) - ) - end + update_item_show_component( + journal: journals.find(notification.journal_id), # take the journal from the journals querried with sequence_version! + grouped_emoji_reactions: grouped_emoji_reactions.fetch(notification.journal_id, {}) + ) + end end def insert_latest_journals_via_turbo_stream(journals, last_update_timestamp, emoji_reactions) - target_component = - if OpenProject::FeatureDecisions.wp_activity_tab_lazy_pagination_active? - WorkPackages::ActivitiesTab::Journals::LazyIndexComponent.new( - work_package: @work_package, - journals: Journal.none, # we do not need to pass any journals here since we just want the component key - paginator: nil, - filter: @filter - ) - else - WorkPackages::ActivitiesTab::Journals::IndexComponent.new( - work_package: @work_package, - filter: @filter - ) - end + target_component = WorkPackages::ActivitiesTab::Journals::LazyIndexComponent.new( + work_package: @work_package, + journals: Journal.none, # we do not need to pass any journals here since we just want the component key + paginator: nil, + filter: @filter + ) journals.where("created_at > ?", last_update_timestamp).find_each do |journal| insert_via_turbo_stream( diff --git a/app/controllers/work_packages/bulk_controller.rb b/app/controllers/work_packages/bulk_controller.rb index 56e36faa6df..e281c2b4c10 100644 --- a/app/controllers/work_packages/bulk_controller.rb +++ b/app/controllers/work_packages/bulk_controller.rb @@ -58,6 +58,18 @@ class WorkPackages::BulkController < ApplicationController end end + def reassign + respond_to do |format| + format.html do + render locals: { work_packages: @work_packages, + associated: WorkPackage.associated_classes_to_address_before_destruction_of(@work_packages) } + end + format.json do + render json: { error_message: "Clean up of associated objects required" }, status: 420 + end + end + end + def destroy if WorkPackage.cleanup_associated_before_destructing_if_required(@work_packages, current_user, params[:to_do]) destroy_work_packages(@work_packages) @@ -71,15 +83,7 @@ class WorkPackages::BulkController < ApplicationController end end else - respond_to do |format| - format.html do - render locals: { work_packages: @work_packages, - associated: WorkPackage.associated_classes_to_address_before_destruction_of(@work_packages) } - end - format.json do - render json: { error_message: "Clean up of associated objects required" }, status: 420 - end - end + redirect_to(action: :reassign, ids: @work_packages.map(&:id)) end end diff --git a/app/forms/admin/settings/api_settings_form.rb b/app/forms/admin/settings/api_settings_form.rb new file mode 100644 index 00000000000..dbecf781b0b --- /dev/null +++ b/app/forms/admin/settings/api_settings_form.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Admin + module Settings + class APISettingsForm < ApplicationForm + delegate :static_link_to, to: :@view_context + + class CORSForm < ApplicationForm + settings_form do |sf| + sf.text_area( + name: :apiv3_cors_origins, + rows: 5, + disabled: !Setting.apiv3_cors_enabled?, + data: { + disable_when_checked_target: "effect", + target_name: "apiv3_cors_enabled" + } + ) + end + end + + settings_form do |sf| + sf.check_box(name: :rest_api_enabled) + + sf.text_field( + name: :apiv3_max_page_size, + type: :number, + input_width: :xsmall, + min: 50 + ) + + sf.check_box(name: :apiv3_write_readonly_attributes) + + sf.fieldset_group(title: I18n.t("setting_apiv3_docs"), mt: 4) do |fg| + fg.check_box( + name: :apiv3_docs_enabled, + caption: I18n.t(:setting_apiv3_docs_enabled_instructions_warning) + ) + end + + sf.fieldset_group(title: I18n.t("setting_apiv3_cors_title")) do |fg| + fg.check_box( + name: :apiv3_cors_enabled, + data: { + target_name: "apiv3_cors_enabled", + disable_when_checked_target: "cause", + show_when_checked_target: "cause" + } + ) do |apiv3_cors_check_box| + apiv3_cors_check_box.nested_form( + classes: ["mt-2", { "d-none" => !Setting.apiv3_cors_enabled? }], + data: { + target_name: "apiv3_cors_enabled", + show_when_checked_target: "effect", + show_when: "checked" + } + ) do |builder| + CORSForm.new(builder) + end + end + end + + sf.submit + end + end + end +end diff --git a/app/forms/admin/settings/api_settings_form/apiv3_max_page_size_caption.html.erb b/app/forms/admin/settings/api_settings_form/apiv3_max_page_size_caption.html.erb new file mode 100644 index 00000000000..e9e8865121c --- /dev/null +++ b/app/forms/admin/settings/api_settings_form/apiv3_max_page_size_caption.html.erb @@ -0,0 +1,9 @@ +<%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= I18n.t(:setting_apiv3_max_page_size_instructions) %> +<% end %> +<%= render(Primer::OpenProject::InlineMessage.new(scheme: :warning, size: :small)) do %> + <%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= render(Primer::Beta::Text.new(tag: :strong).with_content("#{I18n.t(:warning)}:")) %> + <%= I18n.t(:setting_apiv3_max_page_size_warning) %> + <% end %> +<% end %> diff --git a/app/forms/admin/settings/api_settings_form/apiv3_write_readonly_attributes_caption.html.erb b/app/forms/admin/settings/api_settings_form/apiv3_write_readonly_attributes_caption.html.erb new file mode 100644 index 00000000000..29f7e219749 --- /dev/null +++ b/app/forms/admin/settings/api_settings_form/apiv3_write_readonly_attributes_caption.html.erb @@ -0,0 +1,17 @@ +<%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= I18n.t(:setting_apiv3_write_readonly_attributes_instructions) %> +<% end %> +<%= render(Primer::OpenProject::InlineMessage.new(scheme: :warning, size: :small)) do %> + <%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= render(Primer::Beta::Text.new(tag: :strong).with_content("#{I18n.t(:warning)}:")) %> + <%= I18n.t(:setting_apiv3_write_readonly_attributes_warning) %> + <% end %> +<% end %> +<%= render(Primer::Beta::Text.new(tag: :p, mb: 0)) do %> + <%= + I18n.t( + :setting_apiv3_write_readonly_attributes_additional, + api_documentation_link: static_link_to(:api_docs) + ).html_safe + %> +<% end %> diff --git a/app/forms/admin/settings/cors_form/apiv3_cors_origins_caption.html.erb b/app/forms/admin/settings/cors_form/apiv3_cors_origins_caption.html.erb new file mode 100644 index 00000000000..6f35bc4993b --- /dev/null +++ b/app/forms/admin/settings/cors_form/apiv3_cors_origins_caption.html.erb @@ -0,0 +1,10 @@ +<%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= I18n.t(:text_line_separated) %> +<% end %> + +<%= render(Primer::Beta::Text.new(tag: :p)) do %> + <%= I18n.t( + :setting_apiv3_cors_origins_text_html, + origin_link: ::OpenProject::Static::Links.url_for(:origin_mdn_documentation) + ).html_safe %> +<% end %> diff --git a/app/helpers/confirmation_dialog_helper.rb b/app/forms/admin/settings/external_links_settings_form.rb similarity index 56% rename from app/helpers/confirmation_dialog_helper.rb rename to app/forms/admin/settings/external_links_settings_form.rb index 3e7253ac036..946f67c328c 100644 --- a/app/helpers/confirmation_dialog_helper.rb +++ b/app/forms/admin/settings/external_links_settings_form.rb @@ -28,43 +28,15 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module ConfirmationDialogHelper - ## - # Show an angular modal confirmation dialog using the augmented - # ConfirmationDialogService - def augmented_confirmation_dialog( - title: nil, - text: nil, - danger_zone: false, - show_list_data: false, - refresh_on_cancel: false, - list_title: nil, - warning_text: nil, - button_continue: nil, - button_cancel: nil, - icon_continue: nil, - divider: nil, - passed_data: nil - ) - { - "augmented-confirm-dialog": { - text: { - title:, - text:, - button_continue:, - button_cancel: - }.compact, - dangerHighlighting: danger_zone, - divideContent: divider, - listTitle: list_title, - warningText: warning_text, - passedData: passed_data, - showListData: show_list_data, - refreshOnCancel: refresh_on_cancel, - icon: { - continue: icon_continue - }.compact - }.to_json - } +module Admin + module Settings + class ExternalLinksSettingsForm < ApplicationForm + settings_form do |sf| + sf.check_box( + name: :capture_external_links, + caption: I18n.t(:setting_capture_external_links_text) + ) + end + end end end diff --git a/app/forms/login_form.rb b/app/forms/login_form.rb index 26fa8bac351..2e9d7cc1dfb 100644 --- a/app/forms/login_form.rb +++ b/app/forms/login_form.rb @@ -37,6 +37,7 @@ class LoginForm < ApplicationForm f.text_field( name: :username, + id: "username#{@id_suffix}", value: @username, autofocus: @username.blank?, label: User.human_attribute_name(:login), @@ -46,6 +47,7 @@ class LoginForm < ApplicationForm f.text_field( name: :password, + id: "password#{@id_suffix}", type: :password, autofocus: @username.present?, label: User.human_attribute_name(:password), @@ -55,6 +57,7 @@ class LoginForm < ApplicationForm if Setting::Autologin.enabled? f.check_box name: "autologin", + id: "autologin#{@id_suffix}", checked: false, value: 1, label: I18n.t("users.autologins.prompt", @@ -85,9 +88,10 @@ class LoginForm < ApplicationForm end end - def initialize(back_url: nil, username: nil) + def initialize(back_url: nil, username: nil, id_suffix: nil) super() @back_url = back_url @username = username + @id_suffix = id_suffix end end diff --git a/app/forms/mcp_configurations/server_form.rb b/app/forms/mcp_configurations/server_form.rb new file mode 100644 index 00000000000..f5ae64bc1db --- /dev/null +++ b/app/forms/mcp_configurations/server_form.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpConfigurations + class ServerForm < ApplicationForm + include Redmine::I18n + + form do |f| + # TODO: Hide rest of form (and rest of page) when disabled, show when enabled (only after pressing "Update") + f.check_box( + name: :enabled, + label: McpConfiguration.human_attribute_name(:enabled) + ) + + if server_enabled? + f.text_field( + name: :title, + label: McpConfiguration.human_attribute_name(:title), + caption: I18n.t("admin.mcp_configurations.server_form.title_caption"), + input_width: :large + ) + + f.text_area( + name: :description, + label: McpConfiguration.human_attribute_name(:description), + caption: I18n.t("admin.mcp_configurations.server_form.description_caption"), + input_width: :large, + rows: 4 + ) + end + + f.submit( + name: :submit, + label: I18n.t(:button_update), + scheme: :secondary + ) + end + + private + + def server_enabled? + model.enabled? + end + end +end diff --git a/app/forms/projects/settings/creation_wizard/submission_form.rb b/app/forms/projects/settings/creation_wizard/submission_form.rb index e1308ea7b8d..1e25ed57c55 100644 --- a/app/forms/projects/settings/creation_wizard/submission_form.rb +++ b/app/forms/projects/settings/creation_wizard/submission_form.rb @@ -60,7 +60,7 @@ module Projects input_width: :large ) do |list| # Statuses of the selected WP type - type_id = model.project_creation_wizard_work_package_type_id || model.types.first&.id + type_id = model.project_creation_wizard_work_package_type_id if type_id.present? type = Type.find_by(id: type_id) @@ -78,7 +78,7 @@ module Projects name: :project_creation_wizard_assignee_custom_field_id, label: I18n.t("settings.project_initiation_request.submission.assignee"), caption: I18n.t("settings.project_initiation_request.submission.assignee_caption_html").html_safe, - required: true, + required: false, input_width: :large, autocomplete_options: { component: "opce-autocompleter", @@ -99,7 +99,7 @@ module Projects name: :project_creation_wizard_work_package_comment, label: I18n.t("settings.project_initiation_request.submission.work_package_comment"), caption: I18n.t("settings.project_initiation_request.submission.work_package_comment_caption"), - required: true, + required: false, value: model.project_creation_wizard_work_package_comment.presence || I18n.t( "settings.project_initiation_request.submission.work_package_comment_default", project_name: model.name ), diff --git a/app/forms/projects/wizard/custom_fields_form.rb b/app/forms/projects/wizard/custom_fields_form.rb index ace92f665f9..b770a009e5f 100644 --- a/app/forms/projects/wizard/custom_fields_form.rb +++ b/app/forms/projects/wizard/custom_fields_form.rb @@ -33,6 +33,11 @@ module Projects include ::CustomFields::CustomFieldRendering form do |custom_fields_form| + # This placeholder is relevant in cases where no custom fields are rendered at all or all + # custom fields rendered are disabled. Without it, the form might be completely empty and + # the controller would complain about a missing parameter namespace expected by the ActionController::Parameters. + custom_fields_form.hidden(name: "_placeholder", value: "") + render_custom_fields(form: custom_fields_form) end diff --git a/app/forms/settings/form_object_decorator.rb b/app/forms/settings/form_object_decorator.rb index e38c6c4612c..474f1d68245 100644 --- a/app/forms/settings/form_object_decorator.rb +++ b/app/forms/settings/form_object_decorator.rb @@ -57,5 +57,11 @@ module Settings yield Settings::FormObjectDecorator.new(g) end end + + def fieldset_group(**, &) + object.fieldset_group(**) do |g| + yield Settings::FormObjectDecorator.new(g) + end + end end end diff --git a/app/helpers/custom_field_hierarchy_tree_view_helper.rb b/app/helpers/custom_field_hierarchy_tree_view_helper.rb index 4e8b4a889c7..b35d18f5d26 100644 --- a/app/helpers/custom_field_hierarchy_tree_view_helper.rb +++ b/app/helpers/custom_field_hierarchy_tree_view_helper.rb @@ -43,6 +43,12 @@ module CustomFieldHierarchyTreeViewHelper add_sub_tree(tree_view, hierarchy_hash, item_options) end + def standard_tree_view_item_formatter + ::CustomFields::Hierarchy::HierarchicalItemFormatter.new(number_integer_digit_limit: 8, + number_length_limit: 9, + number_precision: 4) + end + private def add_sub_tree(tree, hierarchy_hash, item_options) diff --git a/app/helpers/number_format_helper.rb b/app/helpers/number_format_helper.rb index 1010f671a66..cb9895b2feb 100644 --- a/app/helpers/number_format_helper.rb +++ b/app/helpers/number_format_helper.rb @@ -29,6 +29,8 @@ #++ module NumberFormatHelper + include ActionView::Helpers::NumberHelper + def number_with_limit(number, opts = {}) init_formatting_options(opts) => { digits:, precision:, length_limit: } diff --git a/app/helpers/password_helper.rb b/app/helpers/password_helper.rb index e7d927b0912..fc14f525b8a 100644 --- a/app/helpers/password_helper.rb +++ b/app/helpers/password_helper.rb @@ -60,7 +60,7 @@ module PasswordHelper controller = with_data.fetch(:controller, "") if password_confirmation_required? - with_data.merge(controller: "#{controller} password-confirmation-dialog".strip) + with_data.merge(controller: "#{controller} require-password-confirmation".strip) else with_data end diff --git a/app/helpers/static_links_helper.rb b/app/helpers/static_links_helper.rb index 36b5f6283b3..c4adb702ec6 100644 --- a/app/helpers/static_links_helper.rb +++ b/app/helpers/static_links_helper.rb @@ -31,14 +31,25 @@ module StaticLinksHelper ## # Create a static link to the given key entry - def static_link_to(*path, label: nil) - href = OpenProject::Static::Links.url_for(*path) + # *path - the path segments to look up the link for static links + # href: - optional override for the href if no static link is found or given + # label: - optional override for the label if no static link label is found or given + def static_link_to(*path, href: nil, label: nil, url_params: {}, **system_arguments) + link = OpenProject::Static::Links.url_for(*path, url_params:) || href + raise ArgumentError, "No href found for static link #{path.inspect}" if link.nil? + label_text = label || OpenProject::Static::Links.label_for(*path) - link_to label_text, - href, - class: "openproject--static-link", - target: "_blank", rel: "noopener" + render( + Primer::Beta::Link.new(href: link, + data: { allow_external_link: true }, + **system_arguments, + rel: "noopener", + target: "_blank") + ) do |link| + link.with_trailing_visual_icon(icon: "link-external") + label_text + end end ## diff --git a/app/helpers/workspace_helper.rb b/app/helpers/workspace_helper.rb index 04a86b835f2..23a5844289a 100644 --- a/app/helpers/workspace_helper.rb +++ b/app/helpers/workspace_helper.rb @@ -35,15 +35,23 @@ module WorkspaceHelper program: :versions }.with_indifferent_access.freeze - def new_workspace_title(workspace, template = nil) + def new_workspace_title(workspace) return unless Project.workspace_types.key?(workspace.workspace_type) - if template && OpenProject::FeatureDecisions.project_initiation_active? - I18n.t(:"label_#{workspace.project_creation_wizard_artifact_name}") - else - I18n.t(:"label_#{workspace.workspace_type}_new") - end + I18n.t(:"label_#{workspace.workspace_type}_new") end def workspace_icon(type) = WORKSPACE_ICON_MAPPING[type] + + # Returns a path to which the user should be redirected when cancelling the creation process of + # a workspace item + def workspace_creation_cancel_href(workspace, parent = nil) + if parent.present? + project_overview_path(parent.id) + elsif workspace.portfolio? + portfolios_path + else + projects_path + end + end end diff --git a/app/models/calculated_value_error.rb b/app/models/calculated_value_error.rb index 9d18b49247e..395b2657008 100644 --- a/app/models/calculated_value_error.rb +++ b/app/models/calculated_value_error.rb @@ -38,7 +38,7 @@ class CalculatedValueError < ApplicationRecord ERROR_DISABLED_VALUE].freeze validates :customized, presence: true - validates :custom_field_id, presence: true + validates :custom_field, presence: true validates :error_code, inclusion: { in: VALID_ERROR_CODES } diff --git a/app/models/custom_field/hierarchy/item.rb b/app/models/custom_field/hierarchy/item.rb index d627051a203..7a2b119f61e 100644 --- a/app/models/custom_field/hierarchy/item.rb +++ b/app/models/custom_field/hierarchy/item.rb @@ -37,8 +37,9 @@ class CustomField::Hierarchy::Item < ApplicationRecord scope :including_children, -> { includes(children: :children) } - def to_s = suffix.empty? ? label : "#{label} #{suffix}" + def to_s = formatter.format(item: self) + # @deprecated Use [CustomFields::Hierarchy::HierarchicalItemFormatter] instead. def ancestry_path(include_shorts_and_weights: false) path = self_and_ancestors.filter_map(&:label).reverse.join(" / ") @@ -47,9 +48,16 @@ class CustomField::Hierarchy::Item < ApplicationRecord suffix.empty? ? path : "#{path} #{suffix}" end + # @deprecated Use [CustomFields::Hierarchy::HierarchicalItemFormatter] instead. def suffix return "" if short.nil? && weight.nil? "(#{short || weight})" end + + private + + def formatter + CustomFields::Hierarchy::HierarchicalItemFormatter.default + end end diff --git a/app/models/exports/pdf/common/common.rb b/app/models/exports/pdf/common/common.rb index 7c2d54232c6..9e86fec9ef8 100644 --- a/app/models/exports/pdf/common/common.rb +++ b/app/models/exports/pdf/common/common.rb @@ -62,8 +62,11 @@ module Exports::PDF::Common::Common mime_type: "application/pdf" end - def error(message) - raise ::Exports::ExportError.new message + def error(pdf_error, custom_message = nil) + message = custom_message || I18n.t(:error_pdf_failed_to_export, error: pdf_error.message) + result = ::Exports::ExportError.new message + result.set_backtrace pdf_error.backtrace + raise result end def with_padding(opts, &) diff --git a/app/models/exports/pdf/components/page.rb b/app/models/exports/pdf/components/page.rb index 26ce6ec3783..5583284fb7a 100644 --- a/app/models/exports/pdf/components/page.rb +++ b/app/models/exports/pdf/components/page.rb @@ -99,7 +99,7 @@ module Exports::PDF::Components::Page CustomStyle.current.export_footer.present? && CustomStyle.current.export_footer.local_file.present? image_file = CustomStyle.current.export_footer.local_file.path - content_type = OpenProject::ContentTypeDetector.new(image_file).detect + content_type = OpenProject::ContentTypeDetector.detect(image_file) return unless pdf_embeddable?(content_type) image_file diff --git a/app/models/exports/pdf/demo_generator.rb b/app/models/exports/pdf/demo_generator.rb index 433d45de705..a1e200e14e8 100644 --- a/app/models/exports/pdf/demo_generator.rb +++ b/app/models/exports/pdf/demo_generator.rb @@ -65,8 +65,7 @@ module Exports::PDF render_demo success(pdf.render) rescue StandardError => e - Rails.logger.error "Failed to generate demo PDF: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) + error(e) ensure delete_all_resized_images end diff --git a/app/models/mcp_configuration.rb b/app/models/mcp_configuration.rb new file mode 100644 index 00000000000..403af6cd019 --- /dev/null +++ b/app/models/mcp_configuration.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class McpConfiguration < ApplicationRecord + SERVER_CONFIGURATION_IDENTIFIER = "mcp_server" + + class << self + def server_config + McpConfiguration.find_or_initialize_by(identifier: SERVER_CONFIGURATION_IDENTIFIER) + end + end +end diff --git a/app/models/project.rb b/app/models/project.rb index aef24113909..05c86a7635c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -47,7 +47,7 @@ class Project < ApplicationRecord IDENTIFIER_MAX_LENGTH = 100 # reserved identifiers - RESERVED_IDENTIFIERS = %w[new menu queries filters export_list_modal].freeze + RESERVED_IDENTIFIERS = %w[new menu queries filters].freeze enum :workspace_type, { project: "project", diff --git a/app/models/project/pdf_export/project_initiation.rb b/app/models/project/pdf_export/project_initiation.rb index 0eb227a9d0a..1feb1276647 100644 --- a/app/models/project/pdf_export/project_initiation.rb +++ b/app/models/project/pdf_export/project_initiation.rb @@ -68,8 +68,7 @@ class Project::PDFExport::ProjectInitiation < Exports::Exporter render_doc success(pdf.render) rescue StandardError => e - Rails.logger.error "Failed to generate project creation PDF: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) + error(e) ensure delete_all_resized_images end diff --git a/app/models/project/pdf_export/project_initiation/standard.yml b/app/models/project/pdf_export/project_initiation/standard.yml index 8812e99c7ef..87e91c2a70a 100644 --- a/app/models/project/pdf_export/project_initiation/standard.yml +++ b/app/models/project/pdf_export/project_initiation/standard.yml @@ -57,7 +57,7 @@ cover: margin_top: 30 no_border: true color: "008080" - size: 32 + size: 30 footer: margin_bottom: 20 size: 12 @@ -103,6 +103,7 @@ project: size: 8 styles: [ "bold" ] padding_top: 4 + padding_bottom: 4 header_1: size: 10 header_2: @@ -111,6 +112,7 @@ project: size: 9 paragraph: align: "left" + padding_bottom: 6 unordered_list: spacing: 1 padding_top: 6 @@ -163,8 +165,7 @@ project: border_width: 1 padding: 4 padding_left: 6 - margin_top: 4 - margin_bottom: 4 + margin_bottom: 6 no_border_left: false no_border_right: true no_border_bottom: true @@ -179,14 +180,15 @@ project: background_color: "F5F5F5" color: "880000" padding: 10 + padding_top: 6 size: 8 - margin_top: 10 + margin_top: 2 margin_bottom: 10 font: "SpaceMono" table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] @@ -198,7 +200,7 @@ project: html_table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] diff --git a/app/models/project_custom_field.rb b/app/models/project_custom_field.rb index 18aa643262f..e186b3780c4 100644 --- a/app/models/project_custom_field.rb +++ b/app/models/project_custom_field.rb @@ -63,8 +63,52 @@ class ProjectCustomField < CustomField end end + def toggleable_ids_in_project_settings(project, user, custom_field_section_id) + toggleable_ids( + project:, + user:, + custom_field_section_id:, + options: { is_for_all: false } + ).first + end + + def toggleable_ids_in_creation_wizard_settings(project, custom_field_section_id) + toggleable_ids( + project:, + custom_field_section_id:, + options: { is_required: false }, + invert_options: { is_required: true } + ) + end + private + # Returns an array with: + # 1. a list of custom field ids that can be toggled = activated/enabled or disabled/deactivated. + # 2. a list of custom field ids that cannot be toggled and should always be active/enabled. + def toggleable_ids(project:, custom_field_section_id:, user: User.current, options: {}, invert_options: {}) + base_cf_query = visible(user, project:) + .where(custom_field_section_id:) + + # Fetch project custom field ids that can be enabled/disabled + mutable_cf_ids = base_cf_query.where(**options).pluck(:id) + + # Consider project custom fields that are configured for the project creation wizard as immutable + immutable_cf_ids = if project.project_creation_wizard_enabled? + [project.project_creation_wizard_assignee_custom_field_id] + else + [] + end + + always_active = if invert_options.present? + base_cf_query.where(**invert_options).pluck(:id) + else + [] + end + + [mutable_cf_ids - immutable_cf_ids, immutable_cf_ids + always_active] + end + def mappings_with_view_project_attributes_permission(user, project) # rubocop:disable Metrics/AbcSize allowed_projects = Project.allowed_to(user, :view_project_attributes) mapping_table = ProjectCustomFieldProjectMapping.arel_table diff --git a/app/models/projects/creation_wizard.rb b/app/models/projects/creation_wizard.rb index 882b387df2b..4ae4babebe8 100644 --- a/app/models/projects/creation_wizard.rb +++ b/app/models/projects/creation_wizard.rb @@ -31,6 +31,7 @@ module Projects::CreationWizard ARTIFACT_NAME_OPTIONS = %w[project_creation_wizard project_initiation_request project_mandate].freeze DEFAULT_ARTIFACT_NAME_OPTION = "project_creation_wizard" + DEFAULT_ARTIFACT_EXPORT_TYPE = "attachment" extend ActiveSupport::Concern @@ -44,7 +45,7 @@ module Projects::CreationWizard store_attribute :settings, :project_creation_wizard_notification_text, :string store_attribute :settings, :project_creation_wizard_work_package_comment, :string store_attribute :settings, :project_creation_wizard_artifact_work_package_id, :integer - store_attribute :settings, :project_creation_wizard_artifact_export_type, :string, default: "attachment" + store_attribute :settings, :project_creation_wizard_artifact_export_type, :string store_attribute :settings, :project_creation_wizard_artifact_export_storage, :string # The store_attribute default cannot be used here, because the default is not returned @@ -52,5 +53,25 @@ module Projects::CreationWizard def project_creation_wizard_artifact_name super.presence || DEFAULT_ARTIFACT_NAME_OPTION end + + def project_creation_wizard_work_package_type_id + super.presence || project_creation_wizard_default_work_package_type&.id + end + + def project_creation_wizard_artifact_export_type + super.presence || DEFAULT_ARTIFACT_EXPORT_TYPE + end + + def project_creation_wizard_status_when_submitted_id + super.presence || project_creation_wizard_default_status_when_submitted&.id + end + + def project_creation_wizard_default_work_package_type + types.first + end + + def project_creation_wizard_default_status_when_submitted + project_creation_wizard_default_work_package_type&.statuses&.first + end end end diff --git a/app/models/projects/exports/pdf.rb b/app/models/projects/exports/pdf.rb index 109d3552ca5..d436fa59b79 100644 --- a/app/models/projects/exports/pdf.rb +++ b/app/models/projects/exports/pdf.rb @@ -60,8 +60,7 @@ module Projects::Exports file = render_pdf(all_projects) success(file) rescue StandardError => e - Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) + error(e) end def title diff --git a/app/models/projects/exports/pdf_export/standard.yml b/app/models/projects/exports/pdf_export/standard.yml index 8bf4229e676..42cea7e7e43 100644 --- a/app/models/projects/exports/pdf_export/standard.yml +++ b/app/models/projects/exports/pdf_export/standard.yml @@ -121,6 +121,7 @@ project: size: 8 styles: [ "bold" ] padding_top: 4 + padding_bottom: 4 header_1: size: 10 header_2: @@ -129,12 +130,19 @@ project: size: 9 paragraph: align: "left" + padding_bottom: 6 unordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 unordered_list_point: spacing: 4 ordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 ordered_list_point: spacing: 4 spanning: true @@ -149,6 +157,9 @@ project: list_style_type: upper-roman task_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 task_list_point: spacing: 4 checked: "☑" @@ -169,8 +180,7 @@ project: border_width: 1 padding: 4 padding_left: 6 - margin_top: 4 - margin_bottom: 4 + margin_bottom: 6 no_border_left: false no_border_right: true no_border_bottom: true @@ -185,14 +195,15 @@ project: background_color: "F5F5F5" color: "880000" padding: 10 + padding_top: 6 size: 8 - margin_top: 10 + margin_top: 2 margin_bottom: 10 font: "SpaceMono" table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] @@ -204,7 +215,7 @@ project: html_table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] diff --git a/app/models/queries/filters/shared/custom_fields/user.rb b/app/models/queries/filters/shared/custom_fields/user.rb index 23ec325cf1c..907f5eafcc0 100644 --- a/app/models/queries/filters/shared/custom_fields/user.rb +++ b/app/models/queries/filters/shared/custom_fields/user.rb @@ -41,6 +41,30 @@ module Queries::Filters::Shared def allowed_values @allowed_values ||= me_allowed_value + super end + + def values_replaced + vals = super + vals += group_members_added(vals) + vals + user_groups_added(vals) + end + + private + + def group_members_added(vals) + ::User + .joins(:groups) + .where(groups_users: { id: vals }) + .pluck(:id) + .map(&:to_s) + end + + def user_groups_added(vals) + Group + .joins(:users) + .where(users_users: { id: vals }) + .pluck(:id) + .map(&:to_s) + end end end end diff --git a/app/models/queries/principals.rb b/app/models/queries/principals.rb index af06c573966..94dda8c6e6c 100644 --- a/app/models/queries/principals.rb +++ b/app/models/queries/principals.rb @@ -35,6 +35,7 @@ module Queries::Principals filter Filters::MemberFilter filter Filters::MentionableOnWorkPackageFilter filter Filters::InternalMentionableOnWorkPackageFilter + filter Filters::InvitableToMeetingInProjectFilter filter Filters::StatusFilter filter Filters::NameFilter filter Filters::AnyNameAttributeFilter diff --git a/app/models/queries/principals/filters/invitable_to_meeting_in_project_filter.rb b/app/models/queries/principals/filters/invitable_to_meeting_in_project_filter.rb new file mode 100644 index 00000000000..a715fe6fdf7 --- /dev/null +++ b/app/models/queries/principals/filters/invitable_to_meeting_in_project_filter.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +class Queries::Principals::Filters::InvitableToMeetingInProjectFilter < + Queries::Principals::Filters::PrincipalFilter + def allowed_values + Project.visible(User.current).active.pluck(:name, :id) + end + + def type + :list_optional + end + + def self.key + :invitable_to_meeting_in_project + end + + def human_name + "invitable_to_meeting" + end + + def apply_to(query_scope) + case operator + when "=" + query_scope.visible.where(id: members_with_view_meetings.select(:user_id)) + when "!" + query_scope.visible.where.not(id: members_with_view_meetings.select(:user_id)) + end + end + + private + + def members_with_view_meetings + Member.of_project(values) + .joins(member_roles: { role: :role_permissions }) + .where(role_permissions: { permission: "view_meetings" }) + end +end diff --git a/app/models/queries/projects/filters/custom_field_filter.rb b/app/models/queries/projects/filters/custom_field_filter.rb index a3380624bee..e64597f41e2 100644 --- a/app/models/queries/projects/filters/custom_field_filter.rb +++ b/app/models/queries/projects/filters/custom_field_filter.rb @@ -30,5 +30,6 @@ class Queries::Projects::Filters::CustomFieldFilter < Queries::Projects::Filters::Base include Queries::Filters::Shared::CustomFieldFilter + self.custom_field_context = ::Queries::Projects::CustomFieldContext end diff --git a/app/models/query/highlighting.rb b/app/models/query/highlighting.rb index ccdf0692edc..4c9d216c584 100644 --- a/app/models/query/highlighting.rb +++ b/app/models/query/highlighting.rb @@ -69,8 +69,6 @@ module Query::Highlighting end def highlighted_attributes - return [] unless EnterpriseToken.allows_to?(:conditional_highlighting) - val = super if val.present? @@ -81,8 +79,6 @@ module Query::Highlighting end def highlighting_mode - return :none unless EnterpriseToken.allows_to?(:conditional_highlighting) - val = super if val.present? diff --git a/app/models/query/results/group_by.rb b/app/models/query/results/group_by.rb index 57de5cd2f48..5641c088485 100644 --- a/app/models/query/results/group_by.rb +++ b/app/models/query/results/group_by.rb @@ -125,7 +125,7 @@ module ::Query::Results::GroupBy ->(list) { list }, ->(error) do msg = "#{I18n.t('api_v3.errors.code_500')} #{error}" - raise ::API::Errors::InternalError.new(msg) + raise ::API::Errors::SafeInternalError.new(msg) end ) end diff --git a/app/models/setting.rb b/app/models/setting.rb index 26695cb4ba7..84e9cfc7786 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -273,27 +273,66 @@ class Setting < ApplicationRecord RequestStore.delete :settings_updated_at end - # Returns the Setting instance for the setting named name - # The setting can come from either - # * The database - # * The cached database value - # * The setting definition - # - # In case the definition is overwritten, e.g. via an ENV var, - # the definition value will always be used. + # Returns the value of the setting named name + # The value will be retrieved from that order: + # 1. An overwritten definition (e.g., when provided as ENV var) + # 2. The cached database value + # 3. The setting definition default def self.cached_or_default(name) name = name.to_s - raise "There's no setting named #{name}" unless exists? name + raise "There's no setting named #{name}" unless exists?(name) definition = Settings::Definition[name] - value = if definition.writable? - cached_settings.fetch(name) { definition.value } - else - definition.value - end + # Non-writable settings always use definition value (e.g., from ENV vars) + return deserialize(name, definition.value) unless definition.writable? - deserialize(name, value) + resolve_writable_value(name, definition) + end + + # Resolves the value for a writable setting by checking (in order): + # 1. Cache (RequestStore, or Rails.cache populated from DB) + # 2. Persisted default value if setting has persist_on_first_read? + # 3. Definition default + def self.resolve_writable_value(name, definition) + settings_cache = cached_settings + if settings_cache.key?(name) + deserialize(name, settings_cache[name]) + elsif definition.persist_on_first_read? + persist_default_value(name) + else + deserialize(name, definition.value) + end + end + + # Persists the setting's default value to the database on first read. + # Uses advisory locking to prevent race conditions when multiple processes + # attempt to initialize the same setting concurrently. + # + # After persisting, clears the cache so subsequent calls to cached_settings + # will include the newly created setting. + def self.persist_default_value(name) + definition = Settings::Definition[name] + return definition.value unless settings_table_exists_yet? + + OpenProject::Mutex.with_advisory_lock(Setting, "persist_default_#{name}") do + # Once we acquired the lock, check again whether the setting was not created by now. + setting = find_by(name:) + return setting.value if setting + + generated_value = definition.default + create!(name:, value: formatted_value_for(generated_value, definition)) + + # Clear cache so the next setting call populates it with this value + clear_cache + generated_value + end + end + + def self.formatted_value_for(value, definition) + return value.to_yaml if definition.serialized? + + value.to_s end # Returns the settings from two levels of cache diff --git a/app/models/token/hashed_token.rb b/app/models/token/hashed_token.rb index 3bcd7d01493..c9c16788ffc 100644 --- a/app/models/token/hashed_token.rb +++ b/app/models/token/hashed_token.rb @@ -59,14 +59,42 @@ module Token ## # Find a token from the token value def find_by_plaintext_value(input) - find_by(value: hash_function(input)) + find_by(value: hash_function(input)) || find_and_upgrade_legacy_token(input) end - def find_by_plaintext_value!(input) - find_by!(value: hash_function(input)) + def hash_function(input) + # Use HMAC-SHA256 with a pepper stored in the database. + # This protects low-entropy inputs (like backup codes) and allows + # the pepper to survive secret_key_base changes. + digest = OpenSSL::Digest.new("SHA256") + OpenSSL::HMAC.hexdigest(digest, Setting.hashed_token_pepper, input) + end + + ## + # The previous hashing function used for tokens used the secret_key_base + # as a fixed salt. This is fine to use, but results in tokens being invalidated + # when we e.g., switch between on-premises and cloud instances, or move between servers. + def legacy_hash_function(input) + # Use a pepper for hashing token values. + # We still want to be able to index the hash value for fast lookups, + # so we need to determine the hash without knowing the associated user (and thus its salt) first. + Digest::SHA256.hexdigest(input + Rails.application.secret_key_base) + end + + private + + ## + # When the token is hashed with the legacy hash function + # upgrade it to the new token. + def find_and_upgrade_legacy_token(input) + find_by(value: legacy_hash_function(input)) + &.tap { it.update_column(:value, hash_function(input)) } end end + delegate :hash_function, to: :class + delegate :legacy_hash_function, to: :class + def display_value plain_value.presence || I18n.t("token.hashed_token.display_value_placeholder") end @@ -74,22 +102,23 @@ module Token ## # Validate the user input on the token # 1. The token is still valid - # 2. The plain text matches the hash + # 2. The plain text matches either the new HMAC hash or the legacy hash def valid_plaintext?(input) - hashed_input = hash_function(input) - ActiveSupport::SecurityUtils.secure_compare hashed_input, value + valid_hash?(input) || valid_legacy_hash?(input) end - def self.hash_function(input) - # Use a fixed salt for hashing token values. - # We still want to be able to index the hash value for fast lookups, - # so we need to determine the hash without knowing the associated user (and thus its salt) first. - Digest::SHA256.hexdigest(input + Rails.application.secret_key_base) - end - delegate :hash_function, to: :class - private + def valid_hash?(input) + hashed_input = hash_function(input) + ActiveSupport::SecurityUtils.secure_compare(hashed_input, value) + end + + def valid_legacy_hash?(input) + legacy_hashed_input = legacy_hash_function(input) + ActiveSupport::SecurityUtils.secure_compare(legacy_hashed_input, value) + end + def initialize_values if new_record? && value.blank? @plain_value = self.class.generate_token_value diff --git a/app/models/user.rb b/app/models/user.rb index c26cb2e50cf..b8ca21b3aad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -90,6 +90,10 @@ class User < Principal inverse_of: :user, dependent: :destroy + has_many :recurring_meeting_interim_responses, + inverse_of: :user, + dependent: :destroy + has_many :notification_settings, dependent: :destroy @@ -739,7 +743,7 @@ class User < Principal def self.register_failed_login_attempt_if_user_exists_for(login) user = User.find_by_login(login) - user.log_failed_login if user.present? + user.presence&.log_failed_login nil end diff --git a/app/models/version.rb b/app/models/version.rb index 2c3208d05d4..801f5a37ef8 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -59,6 +59,7 @@ class Version < ApplicationRecord user = args.first || User.current joins(:project) .merge(Project.allowed_to(user, :view_work_packages)) + .or(Project.allowed_to(user, :manage_versions)) .or(Version.systemwide) .or(Version.shared_via_work_packages(user)) } @@ -78,6 +79,7 @@ class Version < ApplicationRecord def visible?(user = User.current) systemwide? || user.allowed_in_project?(:view_work_packages, project) || + user.allowed_in_project?(:manage_versions, project) || work_packages.visible(user).exists? end diff --git a/app/models/work_package.rb b/app/models/work_package.rb index f0611c9626f..6c807eca648 100644 --- a/app/models/work_package.rb +++ b/app/models/work_package.rb @@ -72,6 +72,7 @@ class WorkPackage < ApplicationRecord has_and_belongs_to_many :github_pull_requests # rubocop:disable Rails/HasAndBelongsToMany has_many :meeting_agenda_items, dependent: :nullify + has_many :meeting_outcomes, dependent: :nullify # The MeetingAgendaItem has a default order, but the ordered field is not part of the select # that retrieves the meetings, hence we need to remove the order. has_many :meetings, -> { unscope(:order).distinct }, through: :meeting_agenda_items, source: :meeting diff --git a/app/models/work_package/journalized.rb b/app/models/work_package/journalized.rb index bde600c52fc..518b6919d64 100644 --- a/app/models/work_package/journalized.rb +++ b/app/models/work_package/journalized.rb @@ -34,7 +34,8 @@ module WorkPackage::Journalized included do acts_as_journalized journals_association_extension: proc { def internal_visible - if proxy_association.owner.project.enabled_internal_comments && + if EnterpriseToken.allows_to?(:internal_comments) && + proxy_association.owner.project.enabled_internal_comments && User.current.allowed_in_project?(:view_internal_comments, proxy_association.owner.project) all else diff --git a/app/models/work_package/pdf_export/document_generator.rb b/app/models/work_package/pdf_export/document_generator.rb index 9be73a9d7e3..24ff567ad66 100644 --- a/app/models/work_package/pdf_export/document_generator.rb +++ b/app/models/work_package/pdf_export/document_generator.rb @@ -59,8 +59,7 @@ class WorkPackage::PDFExport::DocumentGenerator < Exports::Exporter render_doc success(pdf.render) rescue StandardError => e - Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) + error(e) ensure delete_all_resized_images end diff --git a/app/models/work_package/pdf_export/report/standard.yml b/app/models/work_package/pdf_export/report/standard.yml index 9e3f7993490..2e5dd90593d 100644 --- a/app/models/work_package/pdf_export/report/standard.yml +++ b/app/models/work_package/pdf_export/report/standard.yml @@ -121,6 +121,7 @@ work_package: margin_top: 0 margin_bottom: 4 markdown_margin: + margin_top: 4 margin_bottom: 16 markdown: font: @@ -130,6 +131,7 @@ work_package: size: 8 styles: [ "bold" ] padding_top: 4 + padding_bottom: 4 header_1: size: 10 header_2: @@ -138,12 +140,19 @@ work_package: size: 9 paragraph: align: "left" + padding_bottom: 6 unordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 unordered_list_point: spacing: 4 ordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 ordered_list_point: spacing: 4 spanning: true @@ -158,6 +167,9 @@ work_package: list_style_type: upper-roman task_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 task_list_point: spacing: 4 checked: "☑" @@ -178,8 +190,7 @@ work_package: border_width: 1 padding: 4 padding_left: 6 - margin_top: 4 - margin_bottom: 4 + margin_bottom: 6 no_border_left: false no_border_right: true no_border_bottom: true @@ -194,14 +205,15 @@ work_package: background_color: "F5F5F5" color: "880000" padding: 10 + padding_top: 6 size: 8 - margin_top: 10 + margin_top: 2 margin_bottom: 10 font: "SpaceMono" table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] @@ -213,7 +225,7 @@ work_package: html_table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] diff --git a/app/models/work_package/pdf_export/work_package_list_to_pdf.rb b/app/models/work_package/pdf_export/work_package_list_to_pdf.rb index 349158d4ce6..c82b2e4327a 100644 --- a/app/models/work_package/pdf_export/work_package_list_to_pdf.rb +++ b/app/models/work_package/pdf_export/work_package_list_to_pdf.rb @@ -83,24 +83,17 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exports::Query end def export! - handle_export_errors do - success(render_work_packages(query.results.work_packages)) - end + success(render_work_packages(query.results.work_packages)) + rescue Prawn::Errors::CannotFit => e + error(e, I18n.t(:error_pdf_export_too_many_columns)) + rescue Exports::PDF::Components::Gantt::InvalidDateRangeError => e + error(e, e.message) + rescue StandardError => e + error(e) end private - def handle_export_errors - yield - rescue Prawn::Errors::CannotFit - error(I18n.t(:error_pdf_export_too_many_columns)) - rescue Exports::PDF::Components::Gantt::InvalidDateRangeError => e - error(e.message) - rescue StandardError => e - Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) - end - def setup_page! self.pdf = get_pdf diff --git a/app/models/work_package/pdf_export/work_package_to_pdf.rb b/app/models/work_package/pdf_export/work_package_to_pdf.rb index b51f0c5d485..541dcb1203a 100644 --- a/app/models/work_package/pdf_export/work_package_to_pdf.rb +++ b/app/models/work_package/pdf_export/work_package_to_pdf.rb @@ -59,8 +59,7 @@ class WorkPackage::PDFExport::WorkPackageToPdf < Exports::Exporter render_work_package success(pdf.render) rescue StandardError => e - Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}" - error(I18n.t(:error_pdf_failed_to_export, error: e.message)) + error(e) ensure delete_all_resized_images end diff --git a/app/models/work_package/pdf_export/wp/standard.yml b/app/models/work_package/pdf_export/wp/standard.yml index fb9ea79c677..d05fcae36c5 100644 --- a/app/models/work_package/pdf_export/wp/standard.yml +++ b/app/models/work_package/pdf_export/wp/standard.yml @@ -106,6 +106,7 @@ work_package: margin_top: 0 margin_bottom: 4 markdown_margin: + margin_top: 4 margin_bottom: 16 markdown: font: @@ -115,6 +116,7 @@ work_package: size: 8 styles: [ "bold" ] padding_top: 4 + padding_bottom: 4 header_1: size: 10 header_2: @@ -123,12 +125,19 @@ work_package: size: 9 paragraph: align: "left" + padding_bottom: 6 unordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 unordered_list_point: spacing: 4 ordered_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 ordered_list_point: spacing: 4 spanning: true @@ -143,6 +152,9 @@ work_package: list_style_type: upper-roman task_list: spacing: 1 + padding_left: 10 + padding_right: 10 + padding_bottom: 6 task_list_point: spacing: 4 checked: "☑" @@ -163,8 +175,7 @@ work_package: border_width: 1 padding: 4 padding_left: 6 - margin_top: 4 - margin_bottom: 4 + margin_bottom: 6 no_border_left: false no_border_right: true no_border_bottom: true @@ -179,14 +190,15 @@ work_package: background_color: "F5F5F5" color: "880000" padding: 10 + padding_top: 6 size: 8 - margin_top: 10 + margin_top: 2 margin_bottom: 10 font: "SpaceMono" table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] @@ -198,7 +210,7 @@ work_package: html_table: auto_width: true margin_top: 4 - margin_bottom: 4 + margin_bottom: 10 header: size: 9 styles: [ "bold" ] diff --git a/app/models/work_package_types/patterns/token_property_mapper.rb b/app/models/work_package_types/patterns/token_property_mapper.rb index 560cfb097ed..ef12da31078 100644 --- a/app/models/work_package_types/patterns/token_property_mapper.rb +++ b/app/models/work_package_types/patterns/token_property_mapper.rb @@ -33,7 +33,7 @@ module WorkPackageTypes class TokenPropertyMapper STRING_OR_NIL = ->(v) { v&.to_s } ARRAY = ->(v) { v.compact.presence&.join(", ") } - DATE = ->(v) { v&.strftime("%Y-%m-%d") } + DATE = ->(v) { v&.strftime(Setting.date_format || "%Y-%m-%d") } DURATION = ->(v) { DurationConverter.output(v) } class << self @@ -120,11 +120,13 @@ module WorkPackageTypes end def tokenize(custom_field_scope, prefix = nil) - custom_field_scope.pluck(:name, :id, :multi_value).map do |name, id, multiple| + custom_field_scope.pluck(:name, :id, :field_format, :multi_value).map do |name, id, format, multiple| formatter = if multiple ARRAY + elsif format == "date" + DATE else - ->(v) { v.is_a?(Symbol) ? v : v&.to_s } + ->(v) { v.is_a?(Symbol) ? v : STRING_OR_NIL.call(v) } end AttributeToken.new( :"#{prefix}custom_field_#{id}", diff --git a/app/seeders/mcp_configuration_seeder.rb b/app/seeders/mcp_configuration_seeder.rb new file mode 100644 index 00000000000..e6a9b97d430 --- /dev/null +++ b/app/seeders/mcp_configuration_seeder.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ +class McpConfigurationSeeder < Seeder + def seed_data! + seed_server_config if server_missing? + + seed_resource_and_tool_configs + end + + def applicable? + server_missing? || tools_missing? || resources_missing? + end + + def not_applicable_message + "No seeding of additional MCP configuration necessary." + end + + private + + def seed_server_config + McpConfiguration.create!( + identifier: McpConfiguration::SERVER_CONFIGURATION_IDENTIFIER, + title: Setting.app_title, + description: "Performs project management tasks on the given installation of OpenProject.", + enabled: true + ) + end + + def seed_resource_and_tool_configs + (McpTools.all + McpResources.all).each do |thing| + next if McpConfiguration.find_by(identifier: thing.qualified_name) + + McpConfiguration.create!( + identifier: thing.qualified_name, + title: thing.default_title, + description: thing.default_description, + enabled: true + ) + end + end + + def server_missing? + McpConfiguration.where(identifier: McpConfiguration::SERVER_CONFIGURATION_IDENTIFIER).empty? + end + + def tools_missing? + (McpTools.all.map(&:qualified_name) - McpConfiguration.pluck(:identifier)).any? + end + + def resources_missing? + (McpResources.all.map(&:qualified_name) - McpConfiguration.pluck(:identifier)).any? + end +end diff --git a/app/seeders/root_seeder.rb b/app/seeders/root_seeder.rb index f3c97029caa..021b78b0202 100644 --- a/app/seeders/root_seeder.rb +++ b/app/seeders/root_seeder.rb @@ -81,6 +81,7 @@ class RootSeeder < Seeder seed_development_data if seed_development_data? seed_plugins_data seed_env_data + seed_mcp_configuration cleanup_seed_data end @@ -179,6 +180,12 @@ class RootSeeder < Seeder end end + def seed_mcp_configuration + print_status "*** Seeding MCP configuration" + McpConfigurationSeeder.new(seed_data).seed! + McpConfigurationSeeder + end + def desired_lang desired_lang = ENV.fetch("OPENPROJECT_SEED_LOCALE", Setting.default_language) diff --git a/app/services/custom_fields/hierarchy/hierarchical_item_formatter.rb b/app/services/custom_fields/hierarchy/hierarchical_item_formatter.rb new file mode 100644 index 00000000000..47cccd91828 --- /dev/null +++ b/app/services/custom_fields/hierarchy/hierarchical_item_formatter.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module CustomFields + module Hierarchy + class HierarchicalItemFormatter + include NumberFormatHelper + + class << self + def default + @default ||= new + end + end + + # @param [Boolean] path Show the full item ancestor path if true + # @param [Boolean] label Show the item label if true + # @param [Boolean] suffix Show the item short or weight if true + # @param [Boolean] suffix_parentheses Wrap suffix in parentheses. + # @param [Integer] number_length_limit If formatting numbers, restrict the whole length of the number to the + # given limit before falling back to scientific notation. + # @param [Integer] number_integer_digit_limit If formatting numbers, restrict the integer part of the number to + # the given limit before falling back to scientific notation. + # @param [Integer] number_precision If formatting numbers, round to the given precision. + def initialize(path: false, + label: true, + suffix: true, + suffix_parentheses: true, + number_length_limit: 9, + number_integer_digit_limit: 8, + number_precision: 4) + @path = path + @label = label + @suffix = suffix + @suffix_parentheses = suffix_parentheses + @number_length_limit = number_length_limit + @number_integer_digit_limit = number_integer_digit_limit + @number_precision = number_precision + end + + def format(item:) + path = [] + path << ancestors(item) if @path + path << item.label if @label + + str_parts = [] + str_parts << path.join(" / ") if path.present? + + if @suffix + suffix = format_suffix(item) + str_parts << suffix if suffix.present? + end + + str_parts.join(" ") + end + + private + + def ancestors(item) = persistence_service.get_ancestors(item:).value!.filter_map(&:label) + + def format_suffix(item) + return "" if item.short.nil? && item.weight.nil? + + opts = { + length_limit: @number_length_limit, + digits: @number_integer_digit_limit, + precision: @number_precision + } + + str = item.short.presence || number_with_limit(item.weight, opts) + + @suffix_parentheses ? "(#{str})" : str + end + + def persistence_service + @persistence_service ||= HierarchicalItemService.new + end + end + end +end diff --git a/app/services/custom_fields/hierarchy/hierarchical_item_service.rb b/app/services/custom_fields/hierarchy/hierarchical_item_service.rb index 57aaafe7dce..2d0cb23593b 100644 --- a/app/services/custom_fields/hierarchy/hierarchical_item_service.rb +++ b/app/services/custom_fields/hierarchy/hierarchical_item_service.rb @@ -115,6 +115,14 @@ module CustomFields Success(item.self_and_ancestors.reverse) end + # Gets all nodes in a tree from the item/node back to the root without the item/node itself. + # Ordered from root to leaf + # @param item [CustomField::Hierarchy::Item] the parent of the node + # @return [Success(Array)] + def get_ancestors(item:) + Success(item.ancestors.reverse) + end + # Gets all descendant nodes in a tree starting from the item/node. # @param item [CustomField::Hierarchy::Item] the node # @param include_self [Boolean] flag diff --git a/app/services/incoming_emails/dispatch_service.rb b/app/services/incoming_emails/dispatch_service.rb index c19c3fe2260..0a144b3a618 100644 --- a/app/services/incoming_emails/dispatch_service.rb +++ b/app/services/incoming_emails/dispatch_service.rb @@ -33,7 +33,7 @@ module IncomingEmails REFERENCES_RE = %r{^ "oof", "Auto-Submitted" => /\Aauto-/ }.freeze @@ -41,6 +41,7 @@ module IncomingEmails # Registry for mail handlers def self.handlers @handlers ||= [ + IncomingEmails::Handlers::MeetingResponse, IncomingEmails::Handlers::MessageReply, IncomingEmails::Handlers::WorkPackage ] @@ -60,9 +61,12 @@ module IncomingEmails @email = email @options = assign_options(options) @sender_email = email.from.to_a.first.to_s.strip + @automated_email ||= automatic_header_present? @logs = [] end + def automated_email? = !!@automated_email + def call! return if ignore_mail? @@ -71,7 +75,7 @@ module IncomingEmails # We only dispatch the action if a user has been accepted or created dispatch if user.present? ensure - report_errors if !@success && Setting.report_incoming_email_errors? + report_errors unless @success end private @@ -138,7 +142,7 @@ module IncomingEmails self .class .handlers - .find { |h| h.handles?(email, reference:) } + .find { |h| h.handles?(email, reference:, automated_email: automated_email?) } &.new(email, user:, plain_text_body:, reference:, options:) end @@ -175,6 +179,8 @@ module IncomingEmails end def report_errors + return if automated_email? + return unless Setting.report_incoming_email_errors? return if logs.empty? UserMailer.incoming_email_error(user, mail_as_hash(email), logs).deliver_later @@ -202,7 +208,7 @@ module IncomingEmails end def ignore_mail? - mail_from_system? || ignored_by_header? || ignored_user? || mail_with_ics_attachment? + mail_from_system? || ignored_user? end def mail_from_system? @@ -224,16 +230,14 @@ module IncomingEmails .map { |mail| mail.to_s.strip.downcase } end - def ignored_by_header? - # Ignore auto generated emails - IGNORED_HEADERS.each do |key, ignored_value| + def automatic_header_present? + AUTOMATIC_HEADERS.each do |key, ignored_value| value = email.header[key] next if value.blank? value = value.to_s.downcase if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value - log "ignoring email with #{key}:#{value} header", report: false - # no point reporting back in case of auto-generated emails + log "email has automated #{key}:#{value} header", report: false return true end end @@ -250,16 +254,6 @@ module IncomingEmails end end - def mail_with_ics_attachment? - if email.attachments.any? { |a| a.content_type.start_with?("text/calendar") } || - (email.multipart? && email.parts.any? { |part| part.content_type.start_with?("text/calendar") }) - log "ignoring email with calendar attachment from [#{sender_email}]" - true - else - false - end - end - # Find a matching object reference in the mail's references header. # We set this header in outgoing emails to include an encoded reference to the object def object_reference_from_header diff --git a/app/services/incoming_emails/handlers/base.rb b/app/services/incoming_emails/handlers/base.rb index 661ab141257..a580f2502f9 100644 --- a/app/services/incoming_emails/handlers/base.rb +++ b/app/services/incoming_emails/handlers/base.rb @@ -40,7 +40,7 @@ module IncomingEmails::Handlers end # Override in subclasses to determine if this handler can process the email - def self.handles?(email, reference:) + def self.handles?(email, reference:, automated_email:) raise NotImplementedError, "Subclasses must implement can_handle? method" end diff --git a/app/services/incoming_emails/handlers/meeting_response.rb b/app/services/incoming_emails/handlers/meeting_response.rb new file mode 100644 index 00000000000..92023741077 --- /dev/null +++ b/app/services/incoming_emails/handlers/meeting_response.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ +module IncomingEmails::Handlers + class MeetingResponse < Base + # Override in subclasses to determine if this handler can process the email + def self.handles?(email, **) + email.attachments.any? { |a| a.content_type.start_with?("text/calendar") } || + (email.multipart? && email.parts.any? { |part| part.content_type.start_with?("text/calendar") }) + end + + # Override in subclasses to process the email + def process + ical_string = extract_ical_string + if ical_string.blank? + return ServiceResult.failure(message: "No iCalendar data found in email from [#{user.mail}]") + end + + AllMeetings::HandleICalResponseService.new(user: user).call(ical_string: ical_string) + end + + private + + def extract_ical_string + attachment = email.attachments.find { |a| a.content_type.start_with?("text/calendar") } + return attachment.decoded if attachment + + calendar_part = email.parts.find { |part| part.content_type.start_with?("text/calendar") } + if calendar_part + Redmine::CodesetUtil.to_utf8(calendar_part.body.decoded, calendar_part.charset) + end + end + end +end diff --git a/app/services/incoming_emails/handlers/message_reply.rb b/app/services/incoming_emails/handlers/message_reply.rb index d2b839eda37..b085b4025a6 100644 --- a/app/services/incoming_emails/handlers/message_reply.rb +++ b/app/services/incoming_emails/handlers/message_reply.rb @@ -30,8 +30,8 @@ module IncomingEmails::Handlers class MessageReply < Base # Override in subclasses to determine if this handler can process the email - def self.handles?(_email, reference:) - reference[:klass] == "message" + def self.handles?(_email, reference:, automated_email:) + !automated_email && reference[:klass] == "message" end # Override in subclasses to process the email diff --git a/app/services/incoming_emails/handlers/work_package.rb b/app/services/incoming_emails/handlers/work_package.rb index afeef87433e..4c34fcda791 100644 --- a/app/services/incoming_emails/handlers/work_package.rb +++ b/app/services/incoming_emails/handlers/work_package.rb @@ -38,7 +38,9 @@ module IncomingEmails::Handlers include WorkPackages::SkipAuthorizationChecks end - def self.handles?(_email, reference:) + def self.handles?(_email, reference:, automated_email:) + return false if automated_email + # Handle work package replies if there's a references match # And handle defaults reference[:klass].nil? || %w[work_package journal].include?(reference[:klass]) diff --git a/app/services/journals/create_service.rb b/app/services/journals/create_service.rb index d6cacd75cec..7f9650795af 100644 --- a/app/services/journals/create_service.rb +++ b/app/services/journals/create_service.rb @@ -118,13 +118,6 @@ module Journals # It consists of a couple of parts that are kept as individual queries (as CTEs) but # are all executed within a single database call. # - # The first four CTEs('cleanup_predecessor_data', 'cleanup_predecessor_attachable', 'cleanup_predecessor_customizable' - # and cleanup_predecessor_storable) strip the information of a predecessor if one exists. If no predecessor exists, - # a noop SQL statement is employed instead. - # To strip the information from the journal, the data record (e.g. from work_packages_journals) as well as the - # attachment and custom value information is removed. The journal itself is kept and will later on have its - # updated_at and possibly its notes property updated. - # # The next CTEs (`max_journals`) responsibility is to fetch the latest journal and have that available for later queries # (i.e. when determining the latest state of the journable, when getting the current version number and when # comparing the timestamps of the last journalization time and the work package's updated_at time). @@ -146,13 +139,21 @@ module Journals # When comparing text based values, newlines are normalized as otherwise users having a different OS might change a text value # without intending to. # - # Journalization is then continued only if + # Journalization continues only if # * a change has been identified (by the `changes` CTE) # * OR a note is present # * OR a cause is present (which would be different from the cause of the predecessor as that one would otherwise be # aggregated with) # * OR a predecessor is replaced # + # If a change has been identified (not for a note or a cause) and a predecessor to aggregate with exists, the predecessor's + # data is stripped. this is done by the CTEs 'cleanup_predecessor_data' and the ones for the associated data, + # 'cleanup_predecessor_XYZ' (where XYZ is e.g. attachable or customizable). If no predecessor exists, + # a noop SQL statement is run instead. + # To strip the information from the journal, the data record (e.g. from work_packages_journals) as well as the + # associated data information is removed. The journal itself is kept and will later on have its + # updated_at and possibly its notes property updated. + # # To enforce consistent timestamps throughout the data structure of journable and journal, the time used for further timestamp # setting is then calculated once between the two CTEs `touch_journable` and `fetch_time`. The auxiliary tables # (attachable_journals, customizable_journals and storages_file_links_journals) don't have timestamps so they can be @@ -198,7 +199,7 @@ module Journals # def create_journal_sql(predecessor, notes, internal, cause) journal_modifications = journal_modification_sql(predecessor, notes, internal, cause) - relation_modifications = relation_modifications_sql(predecessor) + relation_modifications = relation_modifications_sql(predecessor, notes, cause) journal_cte_clauses = [journal_modifications] journal_cte_clauses << relation_modifications if relation_modifications.any? @@ -211,18 +212,18 @@ module Journals def journal_modification_sql(predecessor, notes, internal, cause) <<~SQL - cleanup_predecessor_data AS ( - #{cleanup_predecessor_data(predecessor)} - ), max_journals AS ( - #{select_max_journal_sql(predecessor)} + max_journals AS ( + #{select_max_journal_sql} ), changes AS ( #{select_changed_sql} + ), cleanup_predecessor_data AS ( + #{cleanup_predecessor_data_sql(predecessor, notes, cause)} ), touch_journable AS ( - #{touch_journable_sql(predecessor, notes, cause)} + #{touch_journable_sql(notes, cause)} ), fetch_time AS ( #{fetch_time_sql} ), insert_data AS ( - #{insert_data_sql(predecessor, notes, cause)} + #{insert_data_sql(notes, cause)} ), update_predecessor AS ( #{update_predecessor_sql(predecessor, notes, cause)} ), inserted_journal AS ( @@ -231,29 +232,155 @@ module Journals SQL end - def relation_modifications_sql(predecessor) + def relation_modifications_sql(predecessor, notes, cause) associations.map do |association| - association_modifications_sql(association, predecessor) + association_modifications_sql(association, predecessor, notes, cause) end end - def association_modifications_sql(association, predecessor) + def association_modifications_sql(association, predecessor, notes, cause) <<~SQL cleanup_predecessor_#{association.name} AS ( - #{association.cleanup_predecessor(predecessor)} + #{association.cleanup_predecessor(predecessor, notes, cause)} ), insert_#{association.name} AS ( #{association.insert_sql} ) SQL end - def cleanup_predecessor_data(predecessor) + def select_max_journal_sql + sanitize(<<~SQL, journable_id:, journable_type:) + SELECT + :journable_id journable_id, + :journable_type journable_type, + updated_at, + COALESCE(journals.version, fallback.version) AS version, + COALESCE(journals.id, 0) id, + COALESCE(journals.data_id, 0) data_id + FROM + journals + RIGHT OUTER JOIN + (SELECT 0 AS version) fallback + ON + journals.journable_id = :journable_id + AND journals.journable_type = :journable_type + AND journals.version IN ( + SELECT MAX(version) + FROM journals + WHERE journable_id = :journable_id + AND journable_type = :journable_type + ) + SQL + end + + def select_changed_sql + sql = <<~SQL + SELECT + * + FROM + (#{changes_data_sql}) data_changes + SQL + + associations.each do |association| + sql += <<~SQL + FULL JOIN + (#{association.changes_sql}) #{association.name}_changes + ON + #{association.name}_changes.journable_id = data_changes.journable_id + SQL + end + + sql + end + + def cleanup_predecessor_data_sql(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, data_table_name, :id, :data_id) end + # Updates the updated_at timestamp of the journable. + # + # Whenever an attribute is updated on the journable before creating the journal, the updated_at timestamp + # will already have been increased so nothing needs to be done. + # But if any of the associated data is updated or if only a cause or note is added, the journable would + # otherwise not have received an updated timestamp. + # + # Therefore, this is only carried out if: + # * if there are changes or a note or a cause + # * AND the journable doesn't already have a newer timestamp than the most recent journal + def touch_journable_sql(notes, cause) + if journable.class.aaj_options[:timestamp].to_sym == :updated_at + sql = <<~SQL + UPDATE + #{journable_table_name} + SET + updated_at = statement_timestamp() + WHERE + id = :id + #{only_on_changed_or_forced_condition_sql(notes, cause)} + AND NOT updated_at > (SELECT updated_at FROM max_journals) + RETURNING updated_at + SQL + + sanitize(sql, + id: journable.id) + else + <<~SQL + SELECT NULL::timestamp with time zone AS updated_at + SQL + end + end + + # Fetches the timestamp to be used by all subsequent SQL statements e.g. for + # * setting the created_at and updated_at timestamps of the newly created journal + # * setting the updated_at timestamp on an updated (aggregated with) journal + # * setting the validity_period (upper bound) of the preceding journal. + def fetch_time_sql + sanitize(<<~SQL, journable_timestamp:) + SELECT COALESCE((SELECT updated_at FROM touch_journable), :journable_timestamp) AS updated_at + SQL + end + + def insert_data_sql(notes, cause) + sanitize(<<~SQL, journable_id:) + INSERT INTO + #{data_table_name} ( + #{data_sink_columns} + ) + SELECT + #{data_source_columns} + FROM #{journable_table_name} + #{journable_data_sql_addition} + WHERE + #{journable_table_name}.id = :journable_id + #{only_on_changed_or_forced_condition_sql(notes, cause)} + RETURNING * + SQL + end + + # Sets the validity_period's upper boundary of the preceding journal to the created_at timestamp of the inserted journal. + # The upper bound set is not included. + # If there is a predecessor (meaning we are aggregating/updating an existing journal), nothing is done. + # In that case, the preceding journal is the one we are currently aggregating with so it will still remain + # the most recent one. + def update_predecessor_sql(predecessor, notes, cause) + return "SELECT 1" if predecessor.present? + + <<~SQL + UPDATE + journals + SET + validity_period = tstzrange(lower(validity_period), (SELECT updated_at FROM fetch_time), '[)') + WHERE + id = (SELECT id from max_journals) + #{only_on_changed_or_forced_condition_sql(notes, cause)} + SQL + end + def update_or_insert_journal_sql(predecessor, notes, internal, cause) if predecessor update_journal_sql(predecessor, notes, cause) @@ -265,11 +392,14 @@ module Journals def update_journal_sql(predecessor, notes, cause) # If there is a predecessor, we don't want to create a new one, we simply rewrite it. # The original data of that predecessor (data e.g. work_package_journals, customizable_journals, attachable_journals) - # has been deleted before but the notes need to taken over and the timestamps updated as if the + # has been deleted before but the notes need to be taken over and the timestamps updated as if the # journal would have been created. # # A lot of the data does not need to be set anew, since we only aggregate if that data stays the same # (e.g. the user_id). + # + # In case there is no change at all, the journal will not need to be modified. But even + # without a change, having notes or a cause will require to have the journal written. sql = <<~SQL UPDATE journals @@ -280,6 +410,7 @@ module Journals cause = :cause FROM insert_data WHERE journals.id = :predecessor_id + #{only_on_changed_or_forced_condition_sql(notes, cause)} RETURNING journals.* SQL @@ -334,128 +465,6 @@ module Journals data_type: journable.class.journal_class.name) end - def insert_data_sql(predecessor, notes, cause) - sanitize(<<~SQL, journable_id:) - INSERT INTO - #{data_table_name} ( - #{data_sink_columns} - ) - SELECT - #{data_source_columns} - FROM #{journable_table_name} - #{journable_data_sql_addition} - WHERE - #{journable_table_name}.id = :journable_id - #{only_on_changed_or_forced_condition_sql(predecessor, notes, cause)} - RETURNING * - SQL - end - - # Updates the updated_at timestamp of the journable. - # That is only carried out if the journable doesn't already have a newer timestamp than the most recent journal or - # hasn't been updated by the `#save` call after which this service runs. - # Most recent in this case can mean one of two things: - # * if there is a predecessor we are aggregating with, it is that predecessor - # * otherwise, the most recent journal that we are not aggregating with. - # Whenever an attribute is updated on the journable before creating the journal, the updated_at timestamp - # will already have been increased so nothing needs to be done. - # But if any of the associated data is updated or if only a cause or note is added, the journable would - # otherwise not have receive an updated timestamp. - def touch_journable_sql(predecessor, notes, cause) # rubocop:disable Metrics/AbcSize - if journable.class.aaj_options[:timestamp].to_sym == :updated_at - sql = <<~SQL - UPDATE - #{journable_table_name} - SET - updated_at = COALESCE(:update_timestamp, statement_timestamp()) - WHERE - id = :id - #{only_on_changed_or_forced_condition_sql(predecessor, notes, cause)} - AND NOT updated_at > COALESCE(:predecessor_timestamp, (SELECT updated_at FROM max_journals)) - RETURNING updated_at - SQL - - keep_same_updated_at = journable.updated_at_previously_changed? && !journable.previously_new_record? - sanitize(sql, - update_timestamp: keep_same_updated_at ? journable.updated_at : nil, - predecessor_timestamp: predecessor&.updated_at, - id: journable.id) - else - <<~SQL - SELECT NULL::timestamp with time zone AS updated_at - SQL - end - end - - # Fetches the timestamp to be used by all subsequent SQL statements e.g. for - # * setting the created_at and updated_at timestamps of the newly created journal - # * setting the updated_at timestamp on an updated (aggregated with) journal - # * setting the validity_period (upper bound) of the preceding journal. - def fetch_time_sql - sanitize(<<~SQL, journable_timestamp:) - SELECT COALESCE((SELECT updated_at FROM touch_journable), :journable_timestamp) AS updated_at - SQL - end - - # Sets the validity_period's upper boundary of the preceding journal to the created_at timestamp of the inserted journal. - # The upper bound set is not included. - # If there is a predecessor (meaning we are aggregating/updating an existing journal), nothing is done since - # in that case the preceding journal is the one we are currently aggregating with so it will still remain - # the most recent one. - def update_predecessor_sql(predecessor, notes, cause) - return "SELECT 1" if predecessor.present? - - <<~SQL - UPDATE - journals - SET - validity_period = tstzrange(lower(validity_period), (SELECT updated_at FROM fetch_time), '[)') - WHERE - id = (SELECT id from max_journals) - #{only_on_changed_or_forced_condition_sql(predecessor, notes, cause)} - SQL - end - - def select_max_journal_sql(predecessor) - sanitize(<<~SQL, journable_id:, journable_type:) - SELECT - :journable_id journable_id, - :journable_type journable_type, - updated_at, - COALESCE(journals.version, fallback.version) AS version, - COALESCE(journals.id, 0) id, - COALESCE(journals.data_id, 0) data_id - FROM - journals - RIGHT OUTER JOIN - (SELECT 0 AS version) fallback - ON - journals.journable_id = :journable_id - AND journals.journable_type = :journable_type - AND journals.version IN (#{max_journal_sql(predecessor)}) - SQL - end - - def select_changed_sql - sql = <<~SQL - SELECT - * - FROM - (#{changes_data_sql}) data_changes - SQL - - associations.each do |association| - sql += <<~SQL - FULL JOIN - (#{association.changes_sql}) #{association.name}_changes - ON - #{association.name}_changes.journable_id = data_changes.journable_id - SQL - end - - sql - end - def changes_data_sql sanitize(<<~SQL, journable_id:) SELECT @@ -475,26 +484,6 @@ module Journals SQL end - def max_journal_sql(predecessor) - sql = <<~SQL - SELECT MAX(version) - FROM journals - WHERE journable_id = :journable_id - AND journable_type = :journable_type - SQL - - if predecessor - sanitize "#{sql} AND version < :predecessor_version", - journable_id:, - journable_type:, - predecessor_version: predecessor.version - else - sanitize sql, - journable_id:, - journable_type: - end - end - def data_changes_condition_sql data_table = data_table_name journable_table = journable_table_name @@ -515,19 +504,6 @@ module Journals data_changes.join(" OR ") end - def only_on_changed_or_forced_condition_sql(predecessor, notes, cause) - # The predecessor part of the condition is in in case the predecessor is being aggregated. - # In one of the cases, the change that is being aggregated in nullifies the changes done by the predecessor so - # that in effect, there would be no changes any more (compared to the predecessor's predecessor). - # With changes being a precondition for journalizing, no journal data would be created and the predecessor - # that is aggregated ends up having no data. - if notes.blank? && cause.blank? && predecessor.nil? - "AND EXISTS (SELECT * FROM changes)" - else - "" - end - end - def data_sink_columns text_columns = text_column_names (journable.journaled_columns_names - text_columns + text_columns).join(", ") @@ -580,9 +556,9 @@ module Journals aggregation_active? && within_aggregation_time?(predecessor) && same_user?(predecessor) && - same_cause?(predecessor, cause) && - only_one_note(predecessor, notes) && - same_restriction(predecessor, internal) + only_one_or_same_cause?(predecessor, cause) && + only_one_note?(predecessor, notes) && + same_restriction?(predecessor, internal) end def aggregation_active? @@ -593,20 +569,20 @@ module Journals predecessor.updated_at >= (Time.zone.now - Setting.journal_aggregation_time_minutes.to_i.minutes) end - def only_one_note(predecessor, notes) - predecessor.notes.empty? || notes.empty? - end - - def same_restriction(predecessor, internal) - predecessor.internal == internal - end - def same_user?(predecessor) predecessor.user_id == user.id end - def same_cause?(predecessor, cause) - (predecessor.cause.blank? && cause.blank?) || predecessor.cause == cause + def only_one_or_same_cause?(predecessor, cause) + predecessor.cause.empty? || cause.blank? || predecessor.cause == cause + end + + def only_one_note?(predecessor, notes) + predecessor.notes.empty? || notes.empty? + end + + def same_restriction?(predecessor, internal) + predecessor.internal == internal end def log_journal_creation(predecessor) diff --git a/app/services/journals/create_service/agenda_itemable.rb b/app/services/journals/create_service/agenda_itemable.rb index e976c50c1e8..60d1594a04a 100644 --- a/app/services/journals/create_service/agenda_itemable.rb +++ b/app/services/journals/create_service/agenda_itemable.rb @@ -34,8 +34,10 @@ class Journals::CreateService journable.respond_to?(:agenda_items) end - def cleanup_predecessor(predecessor) + def cleanup_predecessor(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, "meeting_agenda_item_journals", :journal_id, :id) diff --git a/app/services/journals/create_service/attachable.rb b/app/services/journals/create_service/attachable.rb index 10dc86c729c..3d1f49b94a0 100644 --- a/app/services/journals/create_service/attachable.rb +++ b/app/services/journals/create_service/attachable.rb @@ -34,8 +34,10 @@ class Journals::CreateService journable.respond_to?(:attachable?) end - def cleanup_predecessor(predecessor) + def cleanup_predecessor(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, "attachable_journals", :journal_id, :id) diff --git a/app/services/journals/create_service/customizable.rb b/app/services/journals/create_service/customizable.rb index e154afe62bf..ef52d3c3915 100644 --- a/app/services/journals/create_service/customizable.rb +++ b/app/services/journals/create_service/customizable.rb @@ -34,8 +34,10 @@ class Journals::CreateService journable.customizable? end - def cleanup_predecessor(predecessor) + def cleanup_predecessor(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, "customizable_journals", :journal_id, :id) @@ -66,24 +68,36 @@ class Journals::CreateService def changes_sql sanitize(<<~SQL.squish, journable_id:, customized_type: journable_class_name) SELECT - max_journals.journable_id + :journable_id AS JOURNABLE_ID FROM - max_journals - LEFT OUTER JOIN - customizable_journals - ON - customizable_journals.journal_id = max_journals.id + ( + SELECT + custom_field_id, + ARRAY_AGG(#{normalize_newlines_sql('custom_values.value')} ORDER BY value) AS value + FROM + custom_values + WHERE + custom_values.customized_id = :journable_id + AND custom_values.customized_type = :customized_type + AND custom_values.value != '' + GROUP BY + custom_field_id + ) current_values FULL JOIN - (SELECT * - FROM custom_values - WHERE custom_values.customized_id = :journable_id AND custom_values.customized_type = :customized_type) custom_values - ON - custom_values.custom_field_id = customizable_journals.custom_field_id + ( + SELECT + custom_field_id, + ARRAY_AGG(#{normalize_newlines_sql('customizable_journals.value')} ORDER BY value) AS value + FROM + customizable_journals + WHERE + journal_id IN (SELECT id FROM max_journals) + GROUP BY + custom_field_id + ) journal_values + ON current_values.custom_field_id = journal_values.custom_field_id WHERE - (custom_values.value IS NULL AND customizable_journals.value IS NOT NULL) - OR (customizable_journals.value IS NULL AND custom_values.value IS NOT NULL AND custom_values.value != '') - OR (#{normalize_newlines_sql('customizable_journals.value')} != - #{normalize_newlines_sql('custom_values.value')}) + current_values.value IS DISTINCT FROM journal_values.value SQL end end diff --git a/app/services/journals/create_service/helpers.rb b/app/services/journals/create_service/helpers.rb index 635d8814c11..19a4d97d42d 100644 --- a/app/services/journals/create_service/helpers.rb +++ b/app/services/journals/create_service/helpers.rb @@ -39,7 +39,7 @@ class Journals::CreateService def journable_class_name = journable.class.base_class.name - def cleanup_predecessor_for(predecessor, table_name, column, referenced_id) + def cleanup_predecessor_for(predecessor, notes, cause, table_name, column, referenced_id) return "SELECT 1" unless predecessor sanitize(<<~SQL.squish, column => predecessor.send(referenced_id)) @@ -48,9 +48,18 @@ class Journals::CreateService #{table_name} WHERE #{column} = :#{column} + #{only_on_changed_or_forced_condition_sql(notes, cause)} SQL end + def only_on_changed_or_forced_condition_sql(notes, cause) + if notes.blank? && cause.blank? + "AND EXISTS (SELECT * FROM changes)" + else + "" + end + end + def normalize_newlines_sql(column) "REGEXP_REPLACE(COALESCE(#{column},''), '\\r\\n', '\n', 'g')" end diff --git a/app/services/journals/create_service/project_phase.rb b/app/services/journals/create_service/project_phase.rb index 363ec42a39a..ca473a01241 100644 --- a/app/services/journals/create_service/project_phase.rb +++ b/app/services/journals/create_service/project_phase.rb @@ -34,8 +34,10 @@ class Journals::CreateService journable.respond_to?(:phases) end - def cleanup_predecessor(predecessor) + def cleanup_predecessor(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, "project_phase_journals", :journal_id, :id) diff --git a/app/services/journals/create_service/storable.rb b/app/services/journals/create_service/storable.rb index a9e422fee3c..74d71f25186 100644 --- a/app/services/journals/create_service/storable.rb +++ b/app/services/journals/create_service/storable.rb @@ -34,8 +34,10 @@ class Journals::CreateService journable.respond_to?(:file_links) end - def cleanup_predecessor(predecessor) + def cleanup_predecessor(predecessor, notes, cause) cleanup_predecessor_for(predecessor, + notes, + cause, "storages_file_links_journals", :journal_id, :id) diff --git a/app/services/json_schema_loader.rb b/app/services/json_schema_loader.rb new file mode 100644 index 00000000000..f7d97e5009f --- /dev/null +++ b/app/services/json_schema_loader.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class JsonSchemaLoader + def initialize(base_path: "docs/api/apiv3/components/schemas") + @base_path = base_path + end + + def load(schema_name) + load_file("#{@base_path}/#{schema_name}.yml") + end + + private + + def load_file(file_name) + return schema_cache.fetch(file_name) if schema_cache.key?(file_name) + + schema = YAML.load_file(file_name).deep_symbolize_keys + schema = resolve_references(schema, file_name) + schema_cache[file_name] = schema + end + + def resolve_references(schema, file_name) + if schema.key?(:$ref) + ref_file = File.join(File.dirname(file_name), schema.fetch(:$ref)) + return load_file(ref_file) + end + + schema.to_h do |key, value| + next [key, resolve_references(value, file_name)] if value.is_a?(Hash) + + if value.is_a?(Array) + next [ + key, + value.map { |v| v.is_a?(Hash) ? resolve_references(v, file_name) : v } + ] + end + + [key, value] + end + end + + def schema_cache + @schema_cache ||= {} + end +end diff --git a/app/services/mcp_resources.rb b/app/services/mcp_resources.rb new file mode 100644 index 00000000000..e8923e6dc55 --- /dev/null +++ b/app/services/mcp_resources.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class << self + def all + [ + CurrentUser, + Project, + Status, + StatusList, + Type, + TypeList, + User, + Version, + WorkPackage + ] + end + + def enabled + McpConfiguration.where(enabled: true).pluck(:identifier).filter_map { |name| resources_by_name[name] } + end + + def resources_by_name + @resources_by_name ||= all.index_by(&:qualified_name) + end + + def enabled_resources + enabled.select(&:uri) + end + + def enabled_resource_templates + enabled.select(&:uri_template) + end + + def read_resource(uri) + content = read_resource_content(uri) + return [] if content.nil? + + [ + format_json_resource(uri, content) + ] + end + + def read_resource_content(uri, resources_considered: enabled) + resource_class = resources_considered.find { |r| r.uri == uri || r.uri_template&.match?(uri) } + resource_class&.read(uri) + end + + def format_json_resource(uri, content) + { uri:, mimeType: "application/json", text: content.to_json } + end + end +end diff --git a/app/services/mcp_resources/base.rb b/app/services/mcp_resources/base.rb new file mode 100644 index 00000000000..09f0471f8d0 --- /dev/null +++ b/app/services/mcp_resources/base.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class Base + include APIV3Helper + + class << self + def qualified_name + "resources/#{name}" + end + + def default_title(title = nil) + @default_title = title if title.present? + + @default_title + end + + def default_description(description = nil) + @default_description = description if description.present? + + @default_description + end + + def name(name = nil) + @name = name if name.present? + + @name + end + + def uri(suffix = nil) + @uri_suffix = suffix if suffix.present? + return nil if @uri_suffix.nil? + + "#{Setting.protocol}://#{Setting.host_name}#{@uri_suffix}" + end + + def uri_template(suffix = nil) + @template_suffix = suffix if suffix.present? + return nil if @template_suffix.nil? + + UriTemplate.new("#{Setting.protocol}://#{Setting.host_name}#{@template_suffix}") + end + + def resource + raise ArgumentError, "#{self.class.name} can't be used as resource, uri is blank" if uri.blank? + + config = McpConfiguration.find_by(identifier: qualified_name) + return nil if config.nil? + + MCP::Resource.new( + uri:, + name:, + title: config.title, + description: config.description, + mime_type: "application/json" + ) + end + + def resource_template + raise ArgumentError, "#{self.class.name} can't be used as resource_template, uri_template is blank" if uri_template.blank? + + config = McpConfiguration.find_by(identifier: qualified_name) + return nil if config.nil? + + MCP::ResourceTemplate.new( + uri_template:, + name:, + title: config.title, + description: config.description, + mime_type: "application/json" + ) + end + + def read(uri) + params = uri_template&.parse(uri) || {} + new.read(**params) + end + end + + def current_user = ::User.current + + def read(**) + raise NotImplemented, "#{self.class} needs to implement #read method" + end + end +end diff --git a/app/services/mcp_resources/current_user.rb b/app/services/mcp_resources/current_user.rb new file mode 100644 index 00000000000..a00abf3e1a1 --- /dev/null +++ b/app/services/mcp_resources/current_user.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class CurrentUser < Base + name "current_user" + uri "/api/v3/users/me" + + default_title "Current user" + default_description "Representation of the currently authenticated user." + + def read + API::V3::Users::UserRepresenter.create(current_user, current_user:) + end + end +end diff --git a/app/services/mcp_resources/project.rb b/app/services/mcp_resources/project.rb new file mode 100644 index 00000000000..e130fe63245 --- /dev/null +++ b/app/services/mcp_resources/project.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class Project < Base + name "project" + uri_template "/api/v3/projects/{id}" + + default_title "Project" + default_description "Access projects of this OpenProject instance." + + def read(id:) + project = ::Project.visible(current_user).find_by(id:) + return nil if project.nil? + + API::V3::Projects::ProjectRepresenter.create(project, current_user:) + end + end +end diff --git a/app/services/mcp_resources/status.rb b/app/services/mcp_resources/status.rb new file mode 100644 index 00000000000..28b9316fb3c --- /dev/null +++ b/app/services/mcp_resources/status.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class Status < Base + name "status" + uri_template "/api/v3/statuses/{id}" + + default_title "Work Package Status" + default_description "Access work package statuses of this OpenProject instance." + + def read(id:) + status = ::Status.find_by(id:) + return nil if status.nil? + + API::V3::Statuses::StatusRepresenter.new(status, current_user:) + end + end +end diff --git a/app/services/mcp_resources/status_list.rb b/app/services/mcp_resources/status_list.rb new file mode 100644 index 00000000000..be8c6e19826 --- /dev/null +++ b/app/services/mcp_resources/status_list.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class StatusList < Base + name "status_list" + uri "/api/v3/statuses" + + default_title "Work Package Statuses List" + default_description "A list of all work package statuses configured in this OpenProject instance." + + def read + API::V3::Statuses::StatusCollectionRepresenter.new(::Status.all, self_link: api_v3_paths.statuses, current_user:) + end + end +end diff --git a/app/services/mcp_resources/type.rb b/app/services/mcp_resources/type.rb new file mode 100644 index 00000000000..2e7f6f5c8f4 --- /dev/null +++ b/app/services/mcp_resources/type.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class Type < Base + name "type" + uri_template "/api/v3/types/{id}" + + default_title "Work Package Type" + default_description "Access work package types of this OpenProject instance." + + def read(id:) + type = ::Type.find_by(id:) + return nil if type.nil? + + API::V3::Types::TypeRepresenter.new(type, current_user:) + end + end +end diff --git a/app/services/mcp_resources/type_list.rb b/app/services/mcp_resources/type_list.rb new file mode 100644 index 00000000000..cbe4a1693d1 --- /dev/null +++ b/app/services/mcp_resources/type_list.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class TypeList < Base + name "type_list" + uri "/api/v3/types" + + default_title "Work Package Types List" + default_description "A list of all work package types configured in this OpenProject instance." + + def read + API::V3::Types::TypeCollectionRepresenter.new(::Type.includes(:color).all, self_link: api_v3_paths.types, current_user:) + end + end +end diff --git a/app/services/mcp_resources/user.rb b/app/services/mcp_resources/user.rb new file mode 100644 index 00000000000..b9f522f10ea --- /dev/null +++ b/app/services/mcp_resources/user.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class User < Base + name "user" + uri_template "/api/v3/users/{id}" + + default_title "User" + default_description "Access users of this OpenProject instance." + + def read(id:) + user = ::User.visible(current_user).find_by_unique(id) # rubocop:disable Rails/DynamicFindBy + return nil if user.nil? + + API::V3::Users::UserRepresenter.create(user, current_user:) + end + end +end diff --git a/app/services/mcp_resources/version.rb b/app/services/mcp_resources/version.rb new file mode 100644 index 00000000000..c2b1c8cedcf --- /dev/null +++ b/app/services/mcp_resources/version.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class Version < Base + name "version" + uri_template "/api/v3/versions/{id}" + + default_title "Work Package Version" + default_description "Access work package versions of this OpenProject instance." + + def read(id:) + version = ::Version.visible.find_by(id:) + return nil if version.nil? + + API::V3::Versions::VersionRepresenter.create(version, current_user:) + end + end +end diff --git a/app/services/mcp_resources/work_package.rb b/app/services/mcp_resources/work_package.rb new file mode 100644 index 00000000000..58fe41ca792 --- /dev/null +++ b/app/services/mcp_resources/work_package.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpResources + class WorkPackage < Base + name "work_package" + uri_template "/api/v3/work_packages/{id}" + + default_title "Work Package" + default_description "Access work packages of this OpenProject instance." + + def read(id:) + work_package = ::WorkPackage.find_by(id:) + return nil if work_package.nil? + return nil unless current_user.allowed_in_work_package?(:view_work_packages, work_package) + + API::V3::WorkPackages::WorkPackageRepresenter.create(work_package, current_user:, embed_links: true) + end + end +end diff --git a/app/services/mcp_tools.rb b/app/services/mcp_tools.rb new file mode 100644 index 00000000000..046f7878a4c --- /dev/null +++ b/app/services/mcp_tools.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class << self + def all + [ + McpTools::CurrentUser, + McpTools::ListStatuses, + McpTools::ListTypes, + McpTools::SearchProjects, + McpTools::SearchUsers, + McpTools::SearchWorkPackages + ] + end + + def enabled + McpConfiguration.where(enabled: true).pluck(:identifier).filter_map { |name| tools_by_name[name] } + end + + def tools_by_name + @tools_by_name ||= all.index_by(&:qualified_name) + end + end +end diff --git a/app/services/mcp_tools/base.rb b/app/services/mcp_tools/base.rb new file mode 100644 index 00000000000..3f711f3bfdb --- /dev/null +++ b/app/services/mcp_tools/base.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class Base + class << self + def qualified_name + "tools/#{name}" + end + + def page_size + 100 + end + + def default_title(title = nil) + @default_title = title if title.present? + + @default_title + end + + def default_description(description = nil) + @default_description = description if description.present? + + @default_description + end + + def name(name = nil) + @name = name if name.present? + + @name + end + + def pagination_enabled? + @pagination_enabled || false + end + + def enable_pagination + @pagination_enabled = true + end + + def input_schema(schema = nil) + if schema.present? + if pagination_enabled? + page = { + type: "number", + default: 1, + description: "Page number for pagination. If no page is defined, the first result set is returned. " \ + "To get the rest of the results, use a page number of 2 or higher." + } + + @input_schema = schema.deep_merge({ properties: { page: } }) + else + @input_schema = schema + end + end + + @input_schema + end + + def output_schema(schema = nil) + @output_schema = schema if schema.present? + + @output_schema + end + + ## + # Defines a filter for selecting results through input parameters. Only one of filter_proc and filter_class are allowed at + # the same time. If none is provided, a default where-based filter is created, using name as the filtered attribute name. + # + # Filters defined here can later be applied by the tool implementation using #apply_filters. + # + # @param name [Symbol] The name of the input parameter used for filtering. + # @param filter_class [Queries::Filters::Base] A shared filter implementation to be used to perform filtering. + # @param operator [String] When using a filter_class, this is the operator that will be used for filtering. Default: "=" + # @param filter_proc [Proc] A callback procedure used for filtering that must accept two arguments: + # The base scope that the filter applies to and the value that's used as a filter input. + # @example + # filter :id + # + # @example + # filter :name, filter_class: Queries::Projects::Filters::NameFilter, operator: "~" + # + # @example + # filter :status, filter_proc: ->(scope, value) { scope.where(status_name: value) } + def filter(name, filter_class: nil, filter_proc: nil, operator: "=") + if filter_class && filter_proc + raise ArgumentError, "filter_proc and filter_class are mutually exclusive, please only specify one" + end + + if filter_class + filter_proc = ->(scope, value) { filter_class.create!(operator:, values: Array(value)).apply_to(scope) } + elsif !filter_proc + filter_proc = ->(scope, value) { scope.where(name.to_sym => value) } + end + + filters[name.to_sym] = filter_proc + end + + def filters + @filters ||= {} + end + + def annotations(read_only:, idempotent:, destructive:) + @annotations = { + read_only_hint: read_only, + destructive_hint: destructive, + idempotent_hint: idempotent, + open_world_hint: false + } + end + + def read_annotations + # Initialize default annotations, if none are present + annotations(read_only: false, destructive: true, idempotent: false) if @annotations.nil? + + @annotations + end + + def tool + config = McpConfiguration.find_by(identifier: qualified_name) + return nil if config.nil? + + implementation = self + MCP::Tool.define( + name:, + title: config.title, + description: config.description, + input_schema:, + output_schema:, + annotations: read_annotations + ) do |server_context: {}, **opts| + implementation.new(server_context:, tool_context: self).handle_request(**opts) + end + end + end + + def initialize(server_context:, tool_context:) + @server_context = server_context + @tool_context = tool_context + end + + def handle_request(**) + result = call(**) + + if Rails.env.local? && @tool_context.output_schema + # We are only validating the output during development, so we can see errors during dev, but do not break the + # API in production due to minor schema differences. + @tool_context.output_schema.validate_result(result.to_json) + validate_root_output_schema!(@tool_context.output_schema) + end + + format_result(result) + end + + private + + # Intended to be implemented by subclasses. It should return a structured result (e.g. a Hash or Array). + def call(**) + raise NotImplemented, "#{self.class} needs to implement #call method" + end + + def format_result(result) + MCP::Tool::Response.new([{ type: "text", text: result.to_json }], structured_content: result) + end + + def current_user + @server_context[:current_user] + end + + def validate_root_output_schema!(output_schema) + root_type = output_schema.schema.fetch(:type, "object") + return if root_type == "object" + + raise "MCP tools must respond with a JSON object as the root element. #{self.class} responds in #{root_type}." + end + + # Usable by tool implementations. Takes a scope and filters it according to the passed params. + # Filtering happens based on the filters defined for the tool, see .filter. + def apply_filters(scope, params) + params.each do |name, value| + filter_proc = filter_proc_for(name) + scope = filter_proc.call(scope, value) + end + + scope + end + + def filter_proc_for(name) + self.class.filters[name] || raise(ArgumentError, "Don't know how to handle filter argument called #{name}") + end + + def apply_pagination(scope, page) + return scope unless self.class.pagination_enabled? + + page_number = page || 1 + page_size = self.class.page_size + + scope.offset((page_number - 1) * page_size).limit(page_size) + end + end +end diff --git a/app/services/mcp_tools/current_user.rb b/app/services/mcp_tools/current_user.rb new file mode 100644 index 00000000000..5147bfd50f3 --- /dev/null +++ b/app/services/mcp_tools/current_user.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class CurrentUser < ResourceProxyTool + default_title "Current user" + default_description "Returns the currently authenticated user. Also available as an MCP resource." + + name "current_user" + + resource McpResources::CurrentUser + resource_schema "user_model" + resource_annotations + end +end diff --git a/app/services/mcp_tools/list_statuses.rb b/app/services/mcp_tools/list_statuses.rb new file mode 100644 index 00000000000..de681ab1f01 --- /dev/null +++ b/app/services/mcp_tools/list_statuses.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class ListStatuses < ResourceProxyTool + default_title "List statuses" + default_description "Lists all work package statuses available on this OpenProject instance. " \ + "Also available as an MCP resource." + + name "list_statuses" + + resource McpResources::StatusList + resource_schema "status_collection_model" + resource_annotations + end +end diff --git a/app/services/mcp_tools/list_types.rb b/app/services/mcp_tools/list_types.rb new file mode 100644 index 00000000000..d3570b517bb --- /dev/null +++ b/app/services/mcp_tools/list_types.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class ListTypes < ResourceProxyTool + default_title "List types" + default_description "Lists all work package types available on this OpenProject instance. Also available as an MCP resource." + + name "list_types" + + resource McpResources::TypeList + resource_schema "types_model" + resource_annotations + end +end diff --git a/app/services/mcp_tools/resource_proxy_tool.rb b/app/services/mcp_tools/resource_proxy_tool.rb new file mode 100644 index 00000000000..8a21f395e10 --- /dev/null +++ b/app/services/mcp_tools/resource_proxy_tool.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + # A tool that effectively only serves a result that could've been obtained by fetching a resource + # Useful for clients that don't support resources, or ignore them, even if they could support them. + class ResourceProxyTool < Base + class << self + def resource(resource = nil) + @resource = resource if resource.present? + + @resource + end + + def resource_schema(schema_definition) + output_schema(JsonSchemaLoader.new.load(schema_definition)) + end + + def resource_annotations + annotations read_only: true, idempotent: true, destructive: false + end + end + + private + + def call + McpResources.read_resource_content(self.class.resource.uri, resources_considered: McpResources.all) + end + + def format_result(content) + MCP::Tool::Response.new( + [{ type: "resource", resource: McpResources.format_json_resource(self.class.resource.uri, content) }], + structured_content: content + ) + end + end +end diff --git a/app/services/mcp_tools/search_projects.rb b/app/services/mcp_tools/search_projects.rb new file mode 100644 index 00000000000..d45859db08b --- /dev/null +++ b/app/services/mcp_tools/search_projects.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class SearchProjects < Base + default_title "Search projects" + default_description "Search projects matching all of the passed input parameters. " \ + "Parameters not passed are ignored. Results are limited to a maximum " \ + "of #{page_size} projects. To get the rest of the results, call the tool again with a" \ + "page number of 2 or higher." + + name "search_projects" + annotations read_only: true, idempotent: true, destructive: false + enable_pagination + + filter :name, filter_class: Queries::Projects::Filters::NameFilter, operator: "~" + filter :identifier + filter :status_code + + input_schema( + type: :object, + properties: { + name: { type: "string", description: "Name of the project. Accepts partial project names, not case-sensitive." }, + identifier: { type: "string", description: "Project indentifier. Case-sensitive, matching exactly." }, + status_code: { type: "string", enum: Project.status_codes.keys, description: "The project status." } + } + ) + + output_schema( + type: :object, + required: ["items"], + properties: { + items: { + type: :array, + items: JsonSchemaLoader.new.load("project_model") + } + } + ) + + def call(page: nil, **filters) + filtered = apply_filters(Project.visible, filters) + projects = apply_pagination(filtered, page) + + { + items: projects.map { |p| API::V3::Projects::ProjectRepresenter.create(p, current_user:) } + } + end + end +end diff --git a/app/services/mcp_tools/search_users.rb b/app/services/mcp_tools/search_users.rb new file mode 100644 index 00000000000..4f747ce22da --- /dev/null +++ b/app/services/mcp_tools/search_users.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class SearchUsers < Base + default_title "Search users" + default_description "Search users matching all of the passed input parameters. " \ + "Parameters not passed are ignored. Results are limited to a maximum of #{page_size} users. " \ + "To get the rest of the results, call the tool again with a page number of 2 or higher." + + name "search_users" + annotations read_only: true, idempotent: true, destructive: false + enable_pagination + + filter :search_term, filter_class: Queries::Users::Filters::AnyNameAttributeFilter, operator: "~" + + input_schema( + properties: { + search_term: { + type: "string", + description: "A search term to find the user by. Accepts first name and last name. Also accepts email address, " \ + "if instance settings allow it." + } + } + ) + + output_schema( + type: :object, + required: ["items"], + properties: { + items: { + type: :array, + items: JsonSchemaLoader.new.load("user_model") + } + } + ) + + def call(page: nil, **filters) + users = apply_filters(User.visible.not_builtin, filters) + users = apply_pagination(users, page) + + { + items: users.map { |user| API::V3::Users::UserRepresenter.create(user, current_user:) } + } + end + end +end diff --git a/app/services/mcp_tools/search_work_packages.rb b/app/services/mcp_tools/search_work_packages.rb new file mode 100644 index 00000000000..ed19b09999f --- /dev/null +++ b/app/services/mcp_tools/search_work_packages.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module McpTools + class SearchWorkPackages < Base + default_title "Search work packages" + default_description "Search work packages matching all of the passed input parameters. " \ + "Parameters not passed are ignored. Results are limited to a maximum " \ + "of #{page_size} work packages. To get the rest of the results, call the tool again with a" \ + "page number of 2 or higher." + + + name "search_work_packages" + annotations read_only: true, idempotent: true, destructive: false + enable_pagination + + # We can't use subclasses of WorkPackageFilter as filter_class, because they overwrite apply_to badly and rely on using + # an instantiated Query to be used. + filter :assigned_to_id + filter :author_id + filter :id + filter :project_id + filter :status_id + filter :type_id + filter :version_id + filter :subject, filter_proc: ->(wps, v) { wps.where("subject ILIKE '%#{OpenProject::SqlSanitization.quoted_sanitized_sql_like(v)}%'") } + + input_schema( + properties: { + assigned_to_id: { + type: %w[number null], + description: "The ID of the user or group that is assigned to this work package. " \ + "Pass null to search for work packages without an assignee." + }, + author_id: { type: "number", description: "The ID of the user that created this work package." }, + id: { type: "number", description: "The ID of the work package." }, + project_id: { type: "number", description: "The ID of the project that this work package belongs to." }, + status_id: { type: "number", description: "The ID of the work package's status." }, + subject: { + type: "string", + description: "The subject of the work package. Accepts partial subjects, not case-sensitive." + }, + type_id: { type: "number", description: "The ID of the work package's type." }, + version_id: { + type: %w[number null], + description: "The ID of the work package's version. Pass null to search for work packages without a version." + } + } + ) + + output_schema( + type: :object, + required: ["items"], + properties: { + items: { + type: :array, + items: JsonSchemaLoader.new.load("work_package_model") + } + } + ) + + def call(page: nil, **filters) + filtered = apply_filters(WorkPackage.visible, filters) + work_packages = apply_pagination(filtered, page) + + { + items: work_packages.map { |wp| API::V3::WorkPackages::WorkPackageRepresenter.create(wp, current_user:) } + } + end + end +end diff --git a/app/services/project_custom_field_project_mappings/bulk_update_service.rb b/app/services/project_custom_field_project_mappings/bulk_update_service.rb index ef5b866cba4..a0f5f30f391 100644 --- a/app/services/project_custom_field_project_mappings/bulk_update_service.rb +++ b/app/services/project_custom_field_project_mappings/bulk_update_service.rb @@ -56,7 +56,7 @@ module ProjectCustomFieldProjectMappings def perform_bulk_edit(service_call, params) action = params[:action] - custom_field_ids = fetch_custom_field_ids + custom_field_ids = ProjectCustomField.toggleable_ids_in_project_settings(@project, @user, @project_custom_field_section.id) begin case action @@ -83,15 +83,6 @@ module ProjectCustomFieldProjectMappings @project.save if @project.changed_for_autosave? end - def fetch_custom_field_ids - # only custom fields which are not set "for all projects" can be disabled - ProjectCustomField - .visible(@user) - .where(custom_field_section_id: @project_custom_field_section.id) - .where(is_for_all: false) - .pluck(:id) - end - def enable_custom_fields(custom_field_ids) existing_mapping_ids = existing_mappings(custom_field_ids) new_mapping_ids = custom_field_ids - existing_mapping_ids diff --git a/app/services/projects/creation_wizard/create_artifact_work_package_service.rb b/app/services/projects/creation_wizard/create_artifact_work_package_service.rb index 8ab5500c60b..e573500d066 100644 --- a/app/services/projects/creation_wizard/create_artifact_work_package_service.rb +++ b/app/services/projects/creation_wizard/create_artifact_work_package_service.rb @@ -127,7 +127,7 @@ module Projects::CreationWizard def journal_notes <<~COMMENT - #{mention_tag(assignee_user)} + #{assignee_mention_tag} #{project.project_creation_wizard_work_package_comment} @@ -155,11 +155,7 @@ module Projects::CreationWizard end def assigned_to_id - project.custom_value_for(assignee_custom_field).value - end - - def assignee_user - User.find(assigned_to_id) + project.custom_value_for(assignee_custom_field).value if assignee_custom_field end def assignee_custom_field @@ -185,15 +181,19 @@ module Projects::CreationWizard ) end - def mention_tag(user) + def assignee_mention_tag + return if assigned_to_id.nil? + + principal = Principal.find(assigned_to_id) + ApplicationController.helpers.content_tag( "mention", - "@#{user.name}", + "@#{principal.name}", class: "mention", data: { - id: user.id, - type: "user", - text: "@#{user.name}" + id: principal.id, + type: principal.class.model_name.singular, + text: "@#{principal.name}" } ) end diff --git a/app/services/projects/creation_wizard/reupload_artifact_on_status_changes_service.rb b/app/services/projects/creation_wizard/reupload_artifact_on_status_changes_service.rb index 23983626a57..1e124a78e26 100644 --- a/app/services/projects/creation_wizard/reupload_artifact_on_status_changes_service.rb +++ b/app/services/projects/creation_wizard/reupload_artifact_on_status_changes_service.rb @@ -46,7 +46,6 @@ module Projects::CreationWizard end def call!(changes:) - return unless OpenProject::FeatureDecisions.project_initiation_active? return if changes["status_id"].blank? return unless update_is_artifact_work_package? diff --git a/app/services/uri_template.rb b/app/services/uri_template.rb new file mode 100644 index 00000000000..d95e5019acb --- /dev/null +++ b/app/services/uri_template.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +# A simple implementation of the essential parts of https://datatracker.ietf.org/doc/html/rfc6570 +# So far we only need it to parse simple URI templates we defined ourselves and match them, so this is what's implemented. +# If we start needing more, we either need to add more or start double checking existing solutions. +class UriTemplate + def initialize(template_string) + raise ArgumentError, "template_string can't be nil" if template_string.nil? + + @template_string = template_string + @variables = template_string.scan(/\{(\w+)\}/).flatten + matcher_string = "^#{Regexp.escape(template_string)}$" + @variables.each { |v| matcher_string.gsub!(/\\\{#{v}\\\}/, "(?<#{v}>[\\w-]+)") } + @matcher = Regexp.new(matcher_string) + end + + delegate :match?, to: :@matcher + delegate :as_json, to: :to_s + + def parse(uri) + match = @matcher.match(uri) + return nil if match.nil? + + @variables.to_h { |v| [v.to_sym, match[v]] } + end + + def to_s + @template_string + end +end diff --git a/app/views/account/_login.html.erb b/app/views/account/_login.html.erb index 28dce5f9666..b81a0a0dab7 100644 --- a/app/views/account/_login.html.erb +++ b/app/views/account/_login.html.erb @@ -33,7 +33,14 @@ See COPYRIGHT and LICENSE files for more details. url: { controller: "/account", action: "login" }, method: :post ) do |form_builder| - render(LoginForm.new(form_builder, back_url: back_url_to_current_page, username: params[:username])) + render( + LoginForm.new( + form_builder, + back_url: back_url_to_current_page, + username: params[:username], + id_suffix: "-pulldown" + ) + ) end %> diff --git a/app/views/admin/mcp_configurations/index.html.erb b/app/views/admin/mcp_configurations/index.html.erb new file mode 100644 index 00000000000..166b66370ef --- /dev/null +++ b/app/views/admin/mcp_configurations/index.html.erb @@ -0,0 +1,97 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<% html_title t(:label_administration), t("menus.admin.mcp_configurations") %> + +<%= + render(Primer::OpenProject::PageHeader.new) do |header| + header.with_title { t("menus.admin.mcp_configurations") } + header.with_description { t(".description") } + header.with_breadcrumbs( + [{ href: admin_index_path, text: t(:label_administration) }, + { href: mcp_configurations_path, text: t("menus.admin.ai") }, + t("menus.admin.mcp_configurations")] + ) + end +%> + +<%= with_enterprise_banner_guard( + :mcp_server, + variant: :medium, + image: "enterprise/scim-api.png" # TODO: Replace +) do %> + + <%= settings_primer_form_with(model: @server_config, data: { test_selector: "mcp-configuration--server-config-form" }) { |f| render(McpConfigurations::ServerForm.new(f)) } %> + + <% if @server_config.enabled? %> + <%= + render(Primer::Beta::Subhead.new(mt: 4)) do |component| + component.with_heading(tag: :h3) { t(".tools_heading") } + component.with_description do + link_translate( + "admin.mcp_configurations.index.tools_description", + links: { docs_url: %i[sysadmin_docs mcp_tools] }, + external: true + ) + end + end + %> + + <%= + render( + McpConfigurations::MultipleConfigurationsComponent.new( + @tool_configs, + submit_label: t(".tools_submit") + ) + ) + %> + + <%= + render(Primer::Beta::Subhead.new(mt: 4)) do |component| + component.with_heading(tag: :h3) { t(".resources_heading") } + component.with_description do + link_translate( + "admin.mcp_configurations.index.resources_description", + links: { docs_url: %i[sysadmin_docs mcp_resources] }, + external: true + ) + end + end + %> + + <%= + render( + McpConfigurations::MultipleConfigurationsComponent.new( + @resource_configs, + submit_label: t(".resources_submit") + ) + ) + %> + <% end %> +<% end %> diff --git a/app/views/admin/settings/api_settings/show.html.erb b/app/views/admin/settings/api_settings/show.html.erb index b058a7f57ff..048146aeba2 100644 --- a/app/views/admin/settings/api_settings/show.html.erb +++ b/app/views/admin/settings/api_settings/show.html.erb @@ -39,56 +39,17 @@ See COPYRIGHT and LICENSE files for more details. end %> -<%= styled_form_tag(admin_settings_api_path, method: :patch) do %> -
    -
    - <%= setting_check_box :rest_api_enabled %> -
    -
    - <%= setting_number_field :apiv3_max_page_size, min: 50, container_class: "-slim" %> -
    -

    <%= t(:setting_apiv3_max_page_instructions_html) %>

    -
    -
    -
    - <%= setting_check_box :apiv3_write_readonly_attributes, container_class: "-slim" %> -
    -

    <%= t( - :setting_apiv3_write_readonly_attributes_instructions_html, - api_documentation_link: static_link_to(:api_docs) - ) %>

    -
    -
    -
    -
    -
    - <%= I18n.t("setting_apiv3_docs") %> -
    -
    - <%= setting_check_box :apiv3_docs_enabled %> -
    -

    <%= t(:setting_apiv3_docs_enabled_instructions_html, link: api_docs_url) %>

    -

    <%= t(:setting_apiv3_docs_enabled_instructions_warning) %>

    -
    -
    -
    -
    -
    - <%= I18n.t("setting_apiv3_cors_title") %> -
    -
    - <%= setting_check_box :apiv3_cors_enabled %> -
    -
    - <%= setting_text_area :apiv3_cors_origins, rows: 5, container_class: "-wide" %> -
    -

    <%= t(:text_line_separated) %>

    -

    <%= t( - :setting_apiv3_cors_origins_text_html, - origin_link: ::OpenProject::Static::Links.url_for(:origin_mdn_documentation) - ) %>

    -
    -
    -
    - <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %> -<% end %> +<%= + settings_primer_form_with( + url: admin_settings_api_path, + scope: :settings, + method: :patch, + data: { + controller: "disable-when-checked show-when-checked", + disable_when_checked_reversed_value: true, + show_when_checked_visibility_class: "d-none" + } + ) do |f| + render(Admin::Settings::APISettingsForm.new(f)) + end +%> diff --git a/app/views/admin/settings/external_links_settings/show.html.erb b/app/views/admin/settings/external_links_settings/show.html.erb new file mode 100644 index 00000000000..64c4e2547c3 --- /dev/null +++ b/app/views/admin/settings/external_links_settings/show.html.erb @@ -0,0 +1,58 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<% html_title t(:label_administration), t(:label_external_links) %> + +<%= + render(Primer::OpenProject::PageHeader.new) do |header| + header.with_title { t(:label_external_links) } + header.with_breadcrumbs( + [{ href: admin_index_path, text: t("label_administration") }, + { href: admin_settings_general_path, text: t(:label_system_settings) }, + t(:label_external_links)] + ) + end +%> + +<%= render(EnterpriseEdition::BannerComponent.new(:capture_external_links)) %> + +<%= + settings_primer_form_with( + url: admin_settings_external_links_path, + scope: :settings, + method: :patch + ) do |f| + render( + Primer::Forms::FormList.new( + Admin::Settings::ExternalLinksSettingsForm.new(f), + Admin::Settings::Save.new(f) + ) + ) + end +%> diff --git a/app/views/admin/settings/work_packages_general/show.html.erb b/app/views/admin/settings/work_packages_general/show.html.erb index baecea49136..815fdd0e856 100644 --- a/app/views/admin/settings/work_packages_general/show.html.erb +++ b/app/views/admin/settings/work_packages_general/show.html.erb @@ -1,4 +1,4 @@ -<%#-- copyright +<%# -- copyright OpenProject is an open source project management software. Copyright (C) the OpenProject GmbH @@ -25,7 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. -++#%> +++# %> <% html_title t(:label_administration), t(:label_work_package_plural), t(:label_general) -%> @@ -66,19 +66,12 @@ See COPYRIGHT and LICENSE files for more details. end, Hash.new.tap do |options| options[:container_class] = "-middle" - options[:disabled] = "disabled" unless EnterpriseToken.allows_to?(:conditional_highlighting) options[:data] = { show_when_value_selected_target: "cause", target_name: "work_package_list_default_highlighting_mode" } end ) %> -
    - <%= - render(EnterpriseEdition::BannerComponent.new(:conditional_highlighting, mt: 2)) - %> -
    - <% if EnterpriseToken.allows_to? :conditional_highlighting %>
    - <% end %> diff --git a/app/views/api_docs/index.html.erb b/app/views/api_docs/index.html.erb index c56ab8382dd..b4e4eb945a9 100644 --- a/app/views/api_docs/index.html.erb +++ b/app/views/api_docs/index.html.erb @@ -1,9 +1,24 @@ -<%= nonced_javascript_include_tag "openapi-explorer.min.js" %> +<%= nonced_javascript_include_tag variable_asset_path("openapi-explorer.js"), skip_pipeline: true %> -<%= content_tag( - "openapi-explorer", - "", - "spec-url": api_v3_paths.api_spec, - "server-url": api_v3_paths.root_path, - "nav-bg-color": color_by_variable("main-menu-bg-color") - ) %> +<%= nonced_javascript_tag do %> + (function() { + // set openapi-explorer parent width and height explicitly to prevent them being set to 100vw/100vh by the script + // which leads to double scroll bars + // https://github.com/Authress-Engineering/openapi-explorer/blob/49d4d32de6fd7b14a8f5f95fbfefa8cd72e72587/src/openapi-explorer.js#L191-L196 + const contentBody = document.getElementById('content-body'); + if (contentBody) { + contentBody.style.width = 'auto'; + contentBody.style.height = 'auto'; + } + })(); +<% end %> + +<%= + content_tag( + "openapi-explorer", + "", + "spec-url": api_v3_paths.api_spec, + "server-url": api_v3_paths.root_path, + "nav-bg-color": color_by_variable("main-menu-bg-color") + ) +%> diff --git a/app/views/external_link_warning/show.html.erb b/app/views/external_link_warning/show.html.erb new file mode 100644 index 00000000000..c9d8ea101b3 --- /dev/null +++ b/app/views/external_link_warning/show.html.erb @@ -0,0 +1,53 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<% html_title t("external_link_warning.title") %> + +<%= render(OpPrimer::FullPagePromptComponent.new) do |prompt| %> + <% prompt.with_icon(icon: :alert, color: :danger) %> + <% prompt.with_title { t("external_link_warning.title") } %> + + <% prompt.with_action_button( + tag: :a, + href: @external_url, + scheme: :danger, + data: { + turbo: false, + allow_external_link: true + } + ) { I18n.t("external_link_warning.continue_button") } %> + + <%= render(Primer::Box.new(color: :muted)) do %> + <%= render(Primer::Beta::Text.new) { t("external_link_warning.warning_message") } %> + <%= render(Primer::Beta::Text.new(tag: :p, mb: 0, mt: 2)) { t("external_link_warning.continue_message") } %> + <%= render(Primer::Beta::Text.new(tag: :p, + classes: "-break-word", + font_weight: :bold)) { h(@external_url) } %> + <% end %> +<% end %> diff --git a/app/views/highlighting/styles.css.erb b/app/views/highlighting/styles.css.erb index 5cfb64c873f..e45d3cd600b 100644 --- a/app/views/highlighting/styles.css.erb +++ b/app/views/highlighting/styles.css.erb @@ -7,11 +7,11 @@ <% project_phase_color_css %> <% Meetings::Statuses::AVAILABLE.each do |meeting_status| %> - <% resource_color_css("meeting_status", meeting_status) %> + <% resource_color_css("meeting_status", meeting_status, inline_foreground: true) %> <% end %> <% Projects::Statuses::AVAILABLE.each do |project_status| %> - <% resource_color_css("project_status", project_status) %> + <% resource_color_css("project_status", project_status, inline_foreground: true) %> <% end %> <% color_css %> diff --git a/app/views/homescreen/robots.text.erb b/app/views/homescreen/robots.text.erb index 19302ae9ce7..6a84ec81249 100644 --- a/app/views/homescreen/robots.text.erb +++ b/app/views/homescreen/robots.text.erb @@ -39,7 +39,6 @@ Disallow: <%= activities_path %> Disallow: /activity Disallow: <%= search_path %> Disallow: /project_queries/configure_view_modal -Disallow: /projects/export_list_modal <%# Generally allow /projects but disallow those links that change columns, sort order or per page settings %> Disallow: /projects?*columns= Disallow: /projects?*sortBy= diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index 2f7e98fe78f..96f97626981 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -182,7 +182,11 @@ See COPYRIGHT and LICENSE files for more details. <% end %> <% end %> - + <%= render Primer::Beta::Spinner.new( + size: :large, + hidden: true, + wrapper_arguments: { id: "global-loading-indicator", position: :absolute } + ) %> <%# Properly decides main menu expanded state and width before its drawn. Fixes flickering side menu where menu is first expanded, then being collapsed in angular. %> diff --git a/app/views/my/access_tokens/_client_tokens_tab.html.erb b/app/views/my/access_tokens/_client_tokens_tab.html.erb new file mode 100644 index 00000000000..c0663e26b49 --- /dev/null +++ b/app/views/my/access_tokens/_client_tokens_tab.html.erb @@ -0,0 +1,32 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%# locals: (oauth_client_tokens:) -%> + +<%= render partial: "oauth_client_tokens_section", locals: { oauth_client_tokens: } %> diff --git a/app/views/my/access_tokens/_icalendar_tokens_section.html.erb b/app/views/my/access_tokens/_icalendar_tokens_section.html.erb index a85a6220c5d..7342b73aa3d 100644 --- a/app/views/my/access_tokens/_icalendar_tokens_section.html.erb +++ b/app/views/my/access_tokens/_icalendar_tokens_section.html.erb @@ -26,88 +26,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. ++#%> -
    -
    -
    -

    <%= t("my_account.access_tokens.ical.title") %>

    -
    -
    -
    -

    - <%= - link_translate( - "my_account.access_tokens.ical.text_hint_link", - links: { - docs_url: %i[user_guide access_tokens] - } - ) - %> -

    - <% if Setting.ical_enabled? %> - <% if ical_tokens_grouped_by_query.any? %> -
    -
    - - <%= render partial: "token_table_header", - locals: { - column_headers: [ - t("attributes.name"), - Token::ICal.human_attribute_name(:calendar), - WorkPackage.human_attribute_name(:project), - User.human_attribute_name(:created_at), - t("my_account.access_tokens.headers.expiration") - ] - } %> - - <% ical_tokens_grouped_by_query.each do |query_id, tokens| %> - <% tokens.sort_by(&:created_at).each do |token| %> - - - - - - - - - <% end %> - <% end %> - -
    <%= token.ical_token_query_assignment.name %> - <%= link_to token.query.name, - project_calendar_url( - id: query_id, - project_id: token.query.project_id - ) %> - - <%= token.query.project.name %> - - - <%= format_time(token.created_at.to_s) %> - - <%= t("my_account.access_tokens.indefinite_expiration") %> - <%= link_to "", - { action: "revoke_ical_token", access_token_id: token.id }, - data: { - turbo_method: :delete, - turbo_confirm: t("my_account.access_tokens.simple_revoke_confirmation"), - test_selector: "ical-token-row-#{token.id}-revoke" - }, - class: "icon icon-delete" %> -
    -
    -
    - <% else %> - <%= render Primer::Beta::Octicon.new(icon: :info, mr: 1) %> - <%= t("my_account.access_tokens.ical.empty_text_hint") %> - <% end %> - <% else %> -
    - -
    - <% end %> -
    + +<%# locals: (ical_tokens_grouped_by_query:) -%> + +
    + <%= render(Primer::Beta::Subhead.new) do |component| + component.with_heading(tag: :h3, size: :medium) do + t("my_account.access_tokens.ical.title") + end + component.with_description do + link_translate( + "my_account.access_tokens.ical.text_hint_link", + links: { + docs_url: %i[user_guide calendar subscribe] + } + ) + end + end %> + <% if Setting.ical_enabled? %> + <%= render(My::AccessToken::ICal::TableComponent.new(rows: ical_tokens_grouped_by_query.values.flatten)) %> + <% else %> + <%= render(Primer::Alpha::Banner.new(icon: :info)) { t("my_account.access_tokens.ical.disabled_text") } %> + <% end %>
    diff --git a/app/views/my/access_tokens/_oauth_application_tokens_section.html.erb b/app/views/my/access_tokens/_oauth_application_tokens_section.html.erb new file mode 100644 index 00000000000..18c20055446 --- /dev/null +++ b/app/views/my/access_tokens/_oauth_application_tokens_section.html.erb @@ -0,0 +1,43 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%# locals: (granted_applications:) -%> + +
    + <%= render(Primer::Beta::Subhead.new) do |component| + component.with_heading(tag: :h3, size: :medium) do + t("my_account.access_tokens.oauth_application.title") + end + component.with_description do + t("my_account.access_tokens.oauth_application.text_hint") + end + end %> + + <%= render(My::AccessToken::OAuthApplication::TableComponent.new(rows: granted_applications)) %> +
    diff --git a/app/views/my/access_tokens/_oauth_client_tokens_section.html.erb b/app/views/my/access_tokens/_oauth_client_tokens_section.html.erb new file mode 100644 index 00000000000..2449e7ff89d --- /dev/null +++ b/app/views/my/access_tokens/_oauth_client_tokens_section.html.erb @@ -0,0 +1,44 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%# locals: (oauth_client_tokens:) -%> + + +
    + <%= render(Primer::Beta::Subhead.new) do |component| + component.with_heading(tag: :h3, size: :medium) do + t("my_account.access_tokens.oauth_client.title") + end + component.with_description do + t("my_account.access_tokens.oauth_client.text_hint") + end + end %> + + <%= render(My::AccessToken::OAuthClient::TableComponent.new(rows: oauth_client_tokens)) %> +
    diff --git a/app/views/my/access_tokens/_oauth_tokens_section.html.erb b/app/views/my/access_tokens/_oauth_tokens_section.html.erb deleted file mode 100644 index aa9c7f1d925..00000000000 --- a/app/views/my/access_tokens/_oauth_tokens_section.html.erb +++ /dev/null @@ -1,93 +0,0 @@ -<%#-- copyright -OpenProject is an open source project management software. -Copyright (C) the OpenProject GmbH - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 3. - -OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -Copyright (C) 2006-2013 Jean-Philippe Lang -Copyright (C) 2010-2013 the ChiliProject Team - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -See COPYRIGHT and LICENSE files for more details. - -++#%> -
    -
    -
    -

    <%= t("my_account.access_tokens.oauth.title") %>

    -
    -
    -
    -

    - <%= t("my_account.access_tokens.oauth.text_hint") %> -

    - <% if granted_applications.any? %> -
    -
    - - <%= render partial: "token_table_header", - locals: { - column_headers: [ - t("attributes.name"), - User.human_attribute_name(:created_at), - t("my_account.access_tokens.headers.expiration") - ] - } %> - - <% granted_applications.each do |application, tokens| %> - <% latest = tokens.max_by(&:created_at) %> - - - - - - - <% end %> - -
    - <%= t("oauth.application.named", name: application.name) %> -   - (<%= t("oauth.x_active_tokens", count: tokens.count) %>) - - <%= format_time(latest.created_at) %> - - <%= format_time(latest.created_at + latest.expires_in.seconds) %> - - <%= link_to "", - revoke_my_oauth_application_path(application_id: application.id), - data: { - turbo_method: :post, - turbo_confirm: t( - "oauth.revoke_my_application_confirmation", - token_count: t( - "oauth.x_active_tokens", - count: tokens.count - ) - ), - test_selector: "oauth-token-row-#{application.id}-revoke" - }, - class: "icon icon-delete" %> -
    -
    -
    - <% else %> - <%= render Primer::Beta::Octicon.new(icon: :info, mr: 1) %> - <%= t("my_account.access_tokens.oauth.empty_text_hint") %> - <% end %> -
    -
    diff --git a/app/views/my/access_tokens/_provider_tokens_tab.html.erb b/app/views/my/access_tokens/_provider_tokens_tab.html.erb new file mode 100644 index 00000000000..bdc98a37a42 --- /dev/null +++ b/app/views/my/access_tokens/_provider_tokens_tab.html.erb @@ -0,0 +1,44 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%# locals: (granted_applications:, ical_tokens_grouped_by_query:) -%> + +<%= render ::My::AccessToken::APITokensSectionComponent.new(tokens: @user.api_tokens, token_type: Token::API) %> +<%= render partial: "icalendar_tokens_section", locals: { ical_tokens_grouped_by_query: } %> +<%= render ::My::AccessToken::APITokensSectionComponent.new(tokens: @user.ical_meeting_tokens, token_type: Token::ICalMeeting) %> +<%= render partial: "oauth_application_tokens_section", locals: { granted_applications: } %> +<%= render ::My::AccessToken::APITokensSectionComponent.new(tokens: Array(@user.rss_token), token_type: Token::RSS) %> + +
    +
    + + <%= call_hook(:view_access_tokens_table, user: @user) %> +
    +
    +
    diff --git a/app/views/my/access_tokens/_rss_tokens_section.html.erb b/app/views/my/access_tokens/_rss_tokens_section.html.erb deleted file mode 100644 index ffdebe7668d..00000000000 --- a/app/views/my/access_tokens/_rss_tokens_section.html.erb +++ /dev/null @@ -1,94 +0,0 @@ -<%#-- copyright -OpenProject is an open source project management software. -Copyright (C) the OpenProject GmbH - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 3. - -OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -Copyright (C) 2006-2013 Jean-Philippe Lang -Copyright (C) 2010-2013 the ChiliProject Team - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -See COPYRIGHT and LICENSE files for more details. - -++#%> -
    -
    -
    -

    <%= t("my_account.access_tokens.rss.title") %>

    -
    -
    -
    -

    - <%= t("my_account.access_tokens.rss.text_hint") %> -

    - <% if Setting.feeds_enabled? %> - <% if rss_token %> -
    -
    - - <%= render partial: "token_table_header", - locals: { - column_headers: [ - t("attributes.name"), - User.human_attribute_name(:created_at), - t("my_account.access_tokens.headers.expiration") - ] - } %> - - - - - - - - -
    <%= t("my_account.access_tokens.rss.static_token_name") %> - - <%= format_time(rss_token.created_at.to_s) %> - - <%= t("my_account.access_tokens.indefinite_expiration") %> - <%= link_to "", - { action: "revoke_rss_key" }, - data: { - turbo_method: :delete, - turbo_confirm: t("my_account.access_tokens.simple_revoke_confirmation"), - test_selector: "rss-token-revoke" - }, - class: "icon icon-delete" %> -
    -
    -
    - <% else %> - <%= - render Primer::Beta::Link.new(href: generate_rss_key_my_access_tokens_path, data: { turbo_method: :post }, test_selector: "rss-token-add") do |link| - link.with_leading_visual_icon(icon: :plus) - t("my_account.access_tokens.rss.static_token_name") - end - %> - <% end %> - <% else %> -
    - -
    - <% end %> -
    -
    diff --git a/app/views/my/access_tokens/_storage_tokens_section.html.erb b/app/views/my/access_tokens/_storage_tokens_section.html.erb deleted file mode 100644 index 0aebaf93c39..00000000000 --- a/app/views/my/access_tokens/_storage_tokens_section.html.erb +++ /dev/null @@ -1,84 +0,0 @@ -<%#-- copyright -OpenProject is an open source project management software. -Copyright (C) the OpenProject GmbH - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 3. - -OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -Copyright (C) 2006-2013 Jean-Philippe Lang -Copyright (C) 2010-2013 the ChiliProject Team - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -See COPYRIGHT and LICENSE files for more details. - -++#%> -
    -
    -
    -

    <%= t("my_account.access_tokens.storages.title") %>

    -
    -
    -
    -

    - <%= t("my_account.access_tokens.storages.text_hint") %> -

    - <% if @storage_tokens.any? %> -
    -
    - - <%= render partial: "token_table_header", - locals: { - column_headers: [ - t("attributes.name"), - User.human_attribute_name(:created_at), - t("my_account.access_tokens.headers.expiration") - ] - } %> - - <% storage_tokens.each do |token| %> - - - - - - - <% end %> - -
    - <%= token.oauth_client.integration.name %> - - <%= format_time(token.created_at) %> - - <%= format_time(token.updated_at + token.expires_in.seconds) %> - - <%= link_to "", - my_access_token_revoke_storage_token_path(token), - data: { - turbo_method: :delete, - turbo_confirm: t("my_account.access_tokens.storages.revoke_token", storage: token.oauth_client.integration.name), - test_selector: "storages-token-row-#{token.id}-revoke" - }, - class: "icon icon-delete" %> -
    -
    -
    - <% else %> - <%= render Primer::Beta::Octicon.new(icon: :info, mr: 1) %> - <%= t("my_account.access_tokens.storages.empty_text_hint") %> - <% end %> -
    -
    diff --git a/app/views/my/access_tokens/index.html.erb b/app/views/my/access_tokens/index.html.erb index 479fb6c3f7f..69384acbe8f 100644 --- a/app/views/my/access_tokens/index.html.erb +++ b/app/views/my/access_tokens/index.html.erb @@ -21,7 +21,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. @@ -32,23 +32,29 @@ See COPYRIGHT and LICENSE files for more details. <%= render(Primer::OpenProject::PageHeader.new) do |header| header.with_title { I18n.t("my_account.access_tokens.access_tokens") } + header.with_description { I18n.t("my_account.access_tokens.description") } header.with_breadcrumbs( [{ href: my_account_path, text: t(:label_my_account) }, I18n.t("my_account.access_tokens.access_tokens")] ) + + render_tab_header_nav(header, [ + { + name: "provider", + path: my_access_tokens_path(tab: "provider"), + label: t("my_account.access_tokens.tabs.provider.title") + }, + { + name: "client", + path: my_access_tokens_path(tab: "client"), + label: t("my_account.access_tokens.tabs.client.title") + } + ]) end %> -<%= render ::My::AccessToken::APITokensSectionComponent.new(tokens: @user.api_tokens, token_type: Token::API) %> -<%= render partial: "icalendar_tokens_section", locals: { ical_tokens_grouped_by_query: @ical_tokens_grouped_by_query } %> -<%= render ::My::AccessToken::APITokensSectionComponent.new(tokens: @user.ical_meeting_tokens, token_type: Token::ICalMeeting) %> -<%= render partial: "oauth_tokens_section", locals: { granted_applications: granted_applications } %> -<%= render partial: "rss_tokens_section", locals: { rss_token: @user.rss_token } %> -<%= render partial: "storage_tokens_section", locals: { storage_tokens: @storage_tokens } %> -
    -
    - - <%= call_hook(:view_access_tokens_table, user: @user) %> -
    -
    -
    +<% if params[:tab] == "client" %> + <%= render partial: "client_tokens_tab", locals: { oauth_client_tokens: @oauth_client_tokens } %> +<% else %> + <%= render partial: "provider_tokens_tab", locals: { ical_tokens_grouped_by_query: @ical_tokens_grouped_by_query, granted_applications: granted_applications } %> +<% end %> diff --git a/app/views/project_artifacts_mailer/creation_wizard_submitted.html.erb b/app/views/project_artifacts_mailer/creation_wizard_submitted.html.erb index 3f4816ef798..5f1a464ec89 100644 --- a/app/views/project_artifacts_mailer/creation_wizard_submitted.html.erb +++ b/app/views/project_artifacts_mailer/creation_wizard_submitted.html.erb @@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details. <%= format_text(@notification_text, project: @project) %> -<% if @work_package %> +<% if @work_package&.visible? %>

    <%= link_to( I18n.t( diff --git a/app/views/project_artifacts_mailer/creation_wizard_submitted.text.erb b/app/views/project_artifacts_mailer/creation_wizard_submitted.text.erb index 0977542a947..a7fb0f44d91 100644 --- a/app/views/project_artifacts_mailer/creation_wizard_submitted.text.erb +++ b/app/views/project_artifacts_mailer/creation_wizard_submitted.text.erb @@ -32,7 +32,7 @@ See COPYRIGHT and LICENSE files for more details. <%= strip_tags(@notification_text) %> -<% if @work_package.visible? %> +<% if @work_package&.visible? %>

    <%= I18n.t( "settings.project_initiation_request.status.submitted_button", diff --git a/app/views/projects/_new_header.erb b/app/views/projects/_new_header.erb index ae7dc8a449f..eefc97c3bed 100644 --- a/app/views/projects/_new_header.erb +++ b/app/views/projects/_new_header.erb @@ -31,6 +31,16 @@ See COPYRIGHT and LICENSE files for more details. render(Primer::OpenProject::PageHeader.new) do |header| header.with_title { title } + header.with_action_icon_button( + tag: :a, + size: :small, + icon: :x, + mobile_icon: :x, + label: I18n.t(:button_close), + href: workspace_creation_cancel_href(@new_project, @parent), + test_selector: "new_project_form_close_icon" + ) + if @parent header.with_breadcrumbs( [ diff --git a/app/views/projects/new.html.erb b/app/views/projects/new.html.erb index d4b5ed1ff85..b0f1d0c276a 100644 --- a/app/views/projects/new.html.erb +++ b/app/views/projects/new.html.erb @@ -27,7 +27,7 @@ See COPYRIGHT and LICENSE files for more details. ++#%> -<% title = new_workspace_title(@new_project, @template) %> +<% title = new_workspace_title(@new_project) %> <% html_title title %> @@ -42,6 +42,8 @@ See COPYRIGHT and LICENSE files for more details. ) %> <% else %> + <% cancel_href = workspace_creation_cancel_href(@new_project, @parent) %> + <%= render(StepWizard::PageLayoutComponent.new) do |layout| %> <%= layout.with_page_header do @@ -86,7 +88,8 @@ See COPYRIGHT and LICENSE files for more details. form_identifier: "project-create-form", project: @new_project, template: @template, - current_step: params.fetch(:step, 1).to_i + current_step: params.fetch(:step, 1).to_i, + cancel_href: ) end %> diff --git a/app/views/projects/settings/creation_wizard/show.html.erb b/app/views/projects/settings/creation_wizard/show.html.erb index cf355caa4ba..9358f8c50b1 100644 --- a/app/views/projects/settings/creation_wizard/show.html.erb +++ b/app/views/projects/settings/creation_wizard/show.html.erb @@ -42,5 +42,9 @@ See COPYRIGHT and LICENSE files for more details. <%= render partial: "export" %> <% end %> <% else %> - <%= render Projects::Settings::CreationWizard::BlankSlateComponent.new(project: @project) %> + <% with_enterprise_banner_guard(:project_creation_wizard, + variant: :large, + image: "enterprise/project-creation-wizard.png") do %> + <%= render Projects::Settings::CreationWizard::BlankSlateComponent.new(project: @project) %> + <% end %> <% end %> diff --git a/app/views/roles/_permissions.html.erb b/app/views/roles/_permissions.html.erb index e66f3ec9982..e539086e194 100644 --- a/app/views/roles/_permissions.html.erb +++ b/app/views/roles/_permissions.html.erb @@ -45,8 +45,15 @@ See COPYRIGHT and LICENSE files for more details. <% section.with_additional_information do %> <%= check_all_links section_id do |links| - links.with_check_all_button.with_tooltip(text: t(".section_check_all_label", module: module_title)) - links.with_uncheck_all_button.with_tooltip(text: t(".section_uncheck_all_label", module: module_title)) + links.with_check_all_button do |button| + button.with_tooltip(text: t(".section_check_all_label", module: module_title)) + t(:button_check_all) + end + + links.with_uncheck_all_button do |button| + button.with_tooltip(text: t(".section_uncheck_all_label", module: module_title)) + t(:button_uncheck_all) + end end %> <% end %> diff --git a/app/views/roles/report.html.erb b/app/views/roles/report.html.erb index 0a17fb6f41d..c9968c7526b 100644 --- a/app/views/roles/report.html.erb +++ b/app/views/roles/report.html.erb @@ -60,8 +60,15 @@ See COPYRIGHT and LICENSE files for more details. <% section.with_additional_information do %> <%= check_all_links section_id do |links| - links.with_check_all_button.with_tooltip(text: t(".matrix_check_all_label", module: module_title)) - links.with_uncheck_all_button.with_tooltip(text: t(".matrix_uncheck_all_label", module: module_title)) + links.with_check_all_button do |button| + button.with_tooltip(text: t(".matrix_check_all_label", module: module_title)) + t(:button_check_all) + end + + links.with_uncheck_all_button do |button| + button.with_tooltip(text: t(".matrix_uncheck_all_label", module: module_title)) + t(:button_uncheck_all) + end end %> <% end %> diff --git a/app/views/users/form/_basic_attributes.html.erb b/app/views/users/form/_basic_attributes.html.erb index b643ec12fbf..34c88a6a986 100644 --- a/app/views/users/form/_basic_attributes.html.erb +++ b/app/views/users/form/_basic_attributes.html.erb @@ -22,6 +22,7 @@

    <%= f.text_field :mail, required: true, + disabled: !(@user.new_record? || User.current.admin?), container_class: "-middle" %>
    diff --git a/app/views/work_packages/bulk/destroy.html.erb b/app/views/work_packages/bulk/reassign.html.erb similarity index 100% rename from app/views/work_packages/bulk/destroy.html.erb rename to app/views/work_packages/bulk/reassign.html.erb diff --git a/app/views/workflows/_form.html.erb b/app/views/workflows/_form.html.erb index 003552d9504..d7e828e4d2a 100644 --- a/app/views/workflows/_form.html.erb +++ b/app/views/workflows/_form.html.erb @@ -74,8 +74,15 @@ See COPYRIGHT and LICENSE files for more details. <%= check_all_links "workflow_form_#{name}" do |links| - links.with_check_all_button.with_tooltip(text: t(".matrix_check_all_label")) - links.with_uncheck_all_button.with_tooltip(text: t(".matrix_uncheck_all_label")) + links.with_check_all_button do |button| + button.with_tooltip(text: t(".matrix_check_all_label")) + t(:button_check_all) + end + + links.with_uncheck_all_button do |button| + button.with_tooltip(text: t(".matrix_uncheck_all_label")) + t(:button_uncheck_all) + end end %> <% end %> diff --git a/app/workers/work_packages/workflow_job.rb b/app/workers/work_packages/workflow_job.rb index 08365232be5..58d380bafa6 100644 --- a/app/workers/work_packages/workflow_job.rb +++ b/app/workers/work_packages/workflow_job.rb @@ -32,7 +32,7 @@ module WorkPackages class WorkflowJob < ApplicationJob def perform(journal, changes) work_package = journal.journable - process_artifact_changes(work_package, changes) + process_artifact_changes(work_package, changes) unless journal.initial? end private diff --git a/config/constants/settings/definition.rb b/config/constants/settings/definition.rb index ae7fb0a9d91..9ab4a0b1d3c 100644 --- a/config/constants/settings/definition.rb +++ b/config/constants/settings/definition.rb @@ -568,6 +568,14 @@ module Settings format: :string, default: nil }, + hashed_token_pepper: { + description: "Pepper used for HMAC-SHA256 hashing of hashed tokens (e.g. API tokens). " \ + "Auto-initialized on first use. " \ + "Changing this invalidates all existing hashed tokens.", + format: :string, + default: -> { SecureRandom.hex(32) }, + persist_on_first_read: true + }, host_name: { format: :string, default: -> { "#{ENV.fetch('HOST', 'localhost')}:#{ENV.fetch('PORT', 3000)}" }, @@ -1261,9 +1269,8 @@ module Settings }, work_package_list_default_highlighting_mode: { format: :string, - default: -> { EnterpriseToken.allows_to?(:conditional_highlighting) ? "inline" : "none" }, - allowed: -> { Query::QUERY_HIGHLIGHTING_MODES.map(&:to_s) }, - writable: -> { EnterpriseToken.allows_to?(:conditional_highlighting) } + default: -> { "inline" }, + allowed: -> { Query::QUERY_HIGHLIGHTING_MODES.map(&:to_s) } }, work_package_list_default_columns: { default: %w[id subject type status assigned_to priority], @@ -1281,13 +1288,19 @@ module Settings youtube_channel: { description: "Link to YouTube channel in help menu", default: "https://www.youtube.com/c/OpenProjectCommunity" + }, + capture_external_links: { + description: "Redirect external links through a warning page before leaving the application", + default: false, + writable: -> { EnterpriseToken.allows_to?(:capture_external_links) } } }.freeze attr_accessor :name, :format, :env_alias, - :string_values + :string_values, + :persist_on_first_read attr_writer :value, :description, @@ -1301,7 +1314,8 @@ module Settings writable: true, allowed: nil, env_alias: nil, - string_values: false) + string_values: false, + persist_on_first_read: false) self.name = name.to_s self.value = derive_default default_by_env.fetch(Rails.env.to_sym, default) self.format = format ? format.to_sym : deduce_format(value) @@ -1310,6 +1324,15 @@ module Settings self.env_alias = env_alias self.description = description.presence || :"setting_#{name}" self.string_values = string_values + self.persist_on_first_read = persist_on_first_read + + if persist_on_first_read && !writable + raise ArgumentError, "Settings using persist_on_first_read need to be writable" + end + + if persist_on_first_read && default.nil? + raise ArgumentError, "Settings using persist_on_first_read need to have a default value" + end end def derive_default(default) @@ -1346,6 +1369,10 @@ module Settings end end + def persist_on_first_read? + persist_on_first_read + end + def unprefixed_env_var_name_allowed? # Configuration values could be overridden with unprefixed env var # names before being harmonized (PR#10296). Using unprefixed en var @@ -1415,6 +1442,7 @@ module Settings allowed: nil, env_alias: nil, string_values: false, + persist_on_first_read: false, disallow_override: false) name = name.to_sym return if exists?(name) @@ -1427,7 +1455,8 @@ module Settings writable:, allowed:, env_alias:, - string_values:) + string_values:, + persist_on_first_read:) override_value(definition) unless disallow_override all[name] = definition end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index cc9616ee05b..783c72ddd60 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -129,7 +129,7 @@ Doorkeeper.configure do # default_scopes :api_v3 - optional_scopes :scim_v2 + optional_scopes :scim_v2, :mcp # Change the way client credentials are retrieved from the request object. # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb index 158a2b1fa68..51d3c11c9eb 100644 --- a/config/initializers/feature_decisions.rb +++ b/config/initializers/feature_decisions.rb @@ -49,17 +49,12 @@ OpenProject::FeatureDecisions.add :calculated_value_project_attribute, description: "Allows the use of calculated values as a project attribute.", force_active: true -OpenProject::FeatureDecisions.add :oidc_group_sync, - description: "Allows to synchronize groups from OpenID Connect providers", - force_active: true - -OpenProject::FeatureDecisions.add :scim_api, - description: "Enables SCIM API.", - force_active: true - OpenProject::FeatureDecisions.add :beta_widgets, description: "Enables BETA versions of widgets." +OpenProject::FeatureDecisions.add :mcp_server, + description: "Enables the experimental MCP API." + OpenProject::FeatureDecisions.add :minutes_styling_meeting_pdf, description: "Allow exporting a meeting with FITKO styling. " \ "See #65124 for details." @@ -72,12 +67,3 @@ OpenProject::FeatureDecisions.add :new_project_overview, description: "Enables the new project overview experience.", force_active: true -OpenProject::FeatureDecisions.add :wp_activity_tab_lazy_pagination, - description: "Enables lazy pagination for the activity tab." - -OpenProject::FeatureDecisions.add :project_initiation, - description: "Activate the project creation and initiation wizard" - -OpenProject::FeatureDecisions.add :meetings_presentation_mode, - description: "Enables presentation mode for meetings.", - force_active: true diff --git a/config/initializers/mcp.rb b/config/initializers/mcp.rb new file mode 100644 index 00000000000..409c75ed4db --- /dev/null +++ b/config/initializers/mcp.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +MCP.configure do |config| + config.exception_reporter = lambda do |exception, server_context| + cause = exception.cause + message = "Unhandled exception occured during MCP request: #{exception}" + if cause + message += ", caused by #{cause} at #{cause.backtrace.first}" + end + + Rails.logger.error message + OpenProject::Appsignal.trace_exception(exception, server_context) if OpenProject::Appsignal.enabled? + OpenProject::OpenTelemetry.trace_exception(exception, server_context) if OpenProject::OpenTelemetry.enabled? + end +end diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb index 4c59c8b5afd..f4f03e9a517 100644 --- a/config/initializers/menus.rb +++ b/config/initializers/menus.rb @@ -476,6 +476,19 @@ Redmine::MenuManager.map :admin_menu do |menu| caption: :label_calendars_and_dates, icon: "calendar" + menu.push :ai, + { controller: "/admin/mcp_configurations", action: :index }, + if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.mcp_server_active? }, + caption: I18n.t("menus.admin.ai"), + icon: :"sparkle-fill" + + menu.push :mcp_configurations, + { controller: "/admin/mcp_configurations", action: :index }, + if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.mcp_server_active? }, + caption: I18n.t("menus.admin.mcp_configurations"), + enterprise_feature: "mcp_server", + parent: :ai + menu.push :working_days_and_hours, { controller: "/admin/settings/working_days_and_hours_settings", action: :show }, if: ->(_) { User.current.admin? }, @@ -512,6 +525,12 @@ Redmine::MenuManager.map :admin_menu do |menu| caption: :label_languages, parent: :settings + menu.push :settings_external_links, + { controller: "/admin/settings/external_links_settings", action: :show }, + if: ->(_) { User.current.admin? }, + caption: :label_external_links, + parent: :settings + menu.push :settings_repositories, { controller: "/admin/settings/repositories_settings", action: :show }, if: ->(_) { User.current.admin? }, @@ -588,7 +607,7 @@ Redmine::MenuManager.map :admin_menu do |menu| menu.push :scim_clients, { controller: "/admin/scim_clients", action: "index" }, - if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.scim_api_active? }, + if: ->(_) { User.current.admin? }, parent: :authentication, caption: ScimClient.model_name.human(count: 2), enterprise_feature: "scim_api" @@ -723,8 +742,7 @@ Redmine::MenuManager.map :project_menu do |menu| }, project_custom_fields: { caption: :label_project_attributes_plural }, creation_wizard: { - caption: :"settings.project_initiation_request.name.options.project_initiation_request", - if: ->(_) { OpenProject::FeatureDecisions.project_initiation_active? } + caption: :"settings.project_initiation_request.name.options.project_initiation_request" }, modules: { caption: :label_module_plural }, template: { caption: :"projects.settings.template.menu_title" }, diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb index 5756079f2ea..777e2247c47 100644 --- a/config/initializers/permissions.rb +++ b/config/initializers/permissions.rb @@ -158,7 +158,7 @@ Rails.application.reloader.to_prepare do map.permission :export_projects, { - projects: %i[export_list_modal export_project_initiation_pdf] + projects: %i[export_project_initiation_pdf] }, permissible_on: :project, dependencies: :view_project @@ -420,7 +420,7 @@ Rails.application.reloader.to_prepare do wpt.permission :delete_work_packages, { work_packages: :destroy, - "work_packages/bulk": :destroy + "work_packages/bulk": %i[destroy reassign] }, permissible_on: :project, require: :member, diff --git a/config/initializers/scimitar.rb b/config/initializers/scimitar.rb index ecfa267b9ad..a99fec37d69 100644 --- a/config/initializers/scimitar.rb +++ b/config/initializers/scimitar.rb @@ -43,9 +43,6 @@ Rails.application.config.to_prepare do ) return handle_scim_error(error) end - if !OpenProject::FeatureDecisions.scim_api_active? - return handle_scim_error(Scimitar::AuthenticationError.new) - end warden = request.env["warden"] user = warden.authenticate(scope: :scim_v2) diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb index 552bf6b178e..0918ad64492 100644 --- a/config/initializers/warden.rb +++ b/config/initializers/warden.rb @@ -58,6 +58,10 @@ OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope %i[oauth jwt_oidc] end +OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope::MCP_SCOPE, { store: false }) do |_| + %i[oauth jwt_oidc user_basic_auth basic_auth_failure] +end + Rails.application.configure do |app| app.config.middleware.use OpenProject::Authentication::Manager, intercept_401: false # rubocop:disable Naming/VariableNumber end diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 8cdae33fc34..1c0d7673085 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -109,6 +109,23 @@ af: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ af: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ af: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ af: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ af: create_button: "Skep" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ af: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ af: onthefly: "Automatic user creation" port: "Poort" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rolle" notification: @@ -1489,6 +1520,7 @@ af: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ af: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ af: token/api: one: Access token other: Access tokens - type: "Soort" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Gebruiker" version: "Weergawe" workflow: "Werksvloei" @@ -2136,6 +2174,7 @@ af: button_click_to_reveal: "Click to reveal" button_close: "Maak toe" button_collapse_all: "Vou almal op" + button_confirm: "Confirm" button_configure: "Stel op" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ af: button_print: "Print" button_quote: "Haal aan" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Hernoem" button_replace: "Replace" @@ -2419,7 +2459,7 @@ af: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ af: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ af: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ af: custom_actions: title: "Pasgemaakte aksies" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ af: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ af: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ af: instructions_after_error: "Jy kan weer probeer inteken deur %{signin} te kliek. As die probleem voortduur, vra jou admin vir hulp." menus: admin: - mail_notification: "E-poskennisgewings" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "E-poskennisgewings" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ af: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ af: label_always_visible: "Altyd vertoon" label_announcement: "Aankondiging" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API toegangsleutel" label_api_access_key_created_on: "API toegangsleutel %{value} gelede geskep" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ af: label_journal_diff: "Beskrywing Vergelyking" label_language: "Taal" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ af: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projekte" label_project_new: "Nuwe projek" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekte" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ af: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ af: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ af: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentasie" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ af: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ af: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ af: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ af: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 5e4401a4b44..e63aad725a3 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -109,6 +109,23 @@ ar: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -595,6 +612,7 @@ ar: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: لا يوجد حالياً أي أنواع متاحة. form: @@ -609,6 +627,9 @@ ar: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -622,6 +643,7 @@ ar: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -741,9 +763,11 @@ ar: create_button: "إنشاء" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -753,6 +777,9 @@ ar: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: لا يوجد حالياً أخبار لتقدم. @@ -1267,6 +1294,10 @@ ar: onthefly: "Automatic user creation" port: "منفذ" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "دور" notification: @@ -1525,6 +1556,7 @@ ar: even: "يجب أن يكون زوجي." exclusion: "محجوز." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "إنه كبير جدا(الحجم الأكبر هو%{count} بايت)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1547,7 +1579,8 @@ ar: not_a_datetime: "is not a valid date time." not_a_number: "ليس رقماً." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ليس عدداً صحيحاً." not_an_iso_date: "ليس تاريخًا صالحًا. الشكل المطلوب: YYYY-MM-DD." not_same_project: "لا ينتمي إلى نفس المشروع." @@ -2007,7 +2040,20 @@ ar: few: Access tokens many: Access tokens other: Access tokens - type: "النّوع" + token/rss: + zero: "RSS tokens" + one: "RSS token" + two: "RSS tokens" + few: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + zero: "Types" + one: "Type" + two: "Types" + few: "Types" + many: "Types" + other: "Types" user: "المستخدم" version: "الإصدار" workflow: "سير العمل" @@ -2240,6 +2286,7 @@ ar: button_click_to_reveal: "Click to reveal" button_close: "أغلِق" button_collapse_all: "طَيْ الجميع" + button_confirm: "Confirm" button_configure: "تكوين" button_continue: "Continue" button_complete: "Complete" @@ -2272,6 +2319,7 @@ ar: button_print: "طباعة" button_quote: "اقتباس" button_remove: إزالة + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "اعادة التّسمية" button_replace: "Replace" @@ -2603,7 +2651,7 @@ ar: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2613,10 +2661,12 @@ ar: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2657,8 +2707,8 @@ ar: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2688,6 +2738,8 @@ ar: custom_actions: title: "إجراءات مخصصة" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2699,6 +2751,8 @@ ar: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -3000,19 +3054,17 @@ ar: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3080,14 +3132,17 @@ ar: instructions_after_error: "يمكنك محاولة تسجيل الدخول مرة أخرى بواسطة النقر فوق %{signin}. إذا استمر الخطأ، اسأل المسؤول الخاص بك للحصول على تعليمات." menus: admin: - mail_notification: "إشعارات البريد الإلكتروني" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "إشعارات البريد الإلكتروني" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "لا يوجد رموز وصول تعرض" description: "لقد تم الغاء تفعيل كل منهم. يمكن إعادة تفعيلهم من قائمة الإدارة." @@ -3097,34 +3152,56 @@ ar: expiration: "انتهاء الصلاحية" indefinite_expiration: "أبداً" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: - title: "اختصاراً لِ:\"Rich Site Summary\" \nReally Simple Syndication\" or\"" + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" + title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3186,6 +3263,7 @@ ar: label_always_visible: "معروض دائمًا" label_announcement: "إعلان" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "مفتاح الوصول إلى API" label_api_access_key_created_on: "مفتاح الوصول إلى API تم إنشاؤها %{value} قبل ذلك" label_api_access_key_type: "API" @@ -3441,6 +3519,7 @@ ar: label_journal_diff: "مقارنة التوصيف" label_language: "اللغة" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "الانتقال بسرعة إلى مشروع..." label_keyword_plural: "Keywords" @@ -3618,9 +3697,6 @@ ar: label_project_hierarchy: "التسلسل الهرمي للمشروع" label_project_mappings: "المشاريع" label_project_new: "مشروع جديد" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "المشاريع" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -4088,7 +4164,7 @@ ar: notice_not_authorized: "غير مسموح لك بالوصول إلى هذه الصفحة." notice_not_authorized_archived_project: "المشروع الذي تحاول الوصول إليه تمت أرشفته." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "وُجِد %{number} من النتائج.\nإضغط كي تحدد على النتيجة الأولى." notice_principals_found_single: "هنالك نتيجة واحدة.\nإضغط لتحديدها." notice_parent_item_not_found: "Parent item not found." @@ -4443,6 +4519,9 @@ ar: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4455,11 +4534,17 @@ ar: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "التوثيق" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4644,7 +4729,7 @@ ar: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4750,7 +4835,7 @@ ar: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4918,6 +5003,7 @@ ar: 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: "أنت على وشك إزالة بعض أو كافة الأذونات الخاصة بك، وقد لن تكون قادراً على تحرير هذا المشروع بعد ذلك. هل أنت متأكد من أنك تريد المتابعة؟" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "دليل أصول البرنامج المساعدة القابل للكتابة" text_powered_by: "بواسطة %{link}" text_project_identifier_info: "يتم السماح فقط رسائل الحالة الأدنى (أ-ي) وأرقام، والشرطات وتسطير، يجب أن تبدأ بحرف حالة الأدنى." @@ -5422,3 +5508,8 @@ ar: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index a5f73c548b3..a06303477c9 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -109,6 +109,23 @@ az: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ az: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ az: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ az: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ az: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ az: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ az: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ az: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ az: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ az: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ az: button_click_to_reveal: "Click to reveal" button_close: "Bağla" button_collapse_all: "Hamısını yığcamlaşdır" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Davam" button_complete: "Complete" @@ -2168,6 +2207,7 @@ az: button_print: "Print" button_quote: "Sitat" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ az: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ az: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ az: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ az: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ az: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ az: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ az: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ az: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ az: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ az: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ az: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ az: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ az: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ az: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ az: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ az: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ az: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ az: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 4b7d7910bb6..297a58379e1 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -109,6 +109,23 @@ be: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -593,6 +610,7 @@ be: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -607,6 +625,9 @@ be: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -620,6 +641,7 @@ be: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -727,9 +749,11 @@ be: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -739,6 +763,9 @@ be: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1249,6 +1276,10 @@ be: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1507,6 +1538,7 @@ be: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1529,7 +1561,8 @@ be: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1963,7 +1996,16 @@ be: few: Access tokens many: Access tokens other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + few: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + many: "Types" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2188,6 +2230,7 @@ be: button_click_to_reveal: "Click to reveal" button_close: "Зачыніць" button_collapse_all: "Згарнуць усё" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2220,6 +2263,7 @@ be: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2511,7 +2555,7 @@ be: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2521,10 +2565,12 @@ be: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2565,8 +2611,8 @@ be: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2596,6 +2642,8 @@ be: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2607,6 +2655,8 @@ be: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2906,19 +2956,17 @@ be: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2986,14 +3034,17 @@ be: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -3003,34 +3054,56 @@ be: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Файлавыя сховішча" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3092,6 +3165,7 @@ be: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3347,6 +3421,7 @@ be: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3524,9 +3599,6 @@ be: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3992,7 +4064,7 @@ be: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4347,6 +4419,9 @@ be: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4359,11 +4434,17 @@ be: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4548,7 +4629,7 @@ be: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4654,7 +4735,7 @@ be: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4822,6 +4903,7 @@ be: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5322,3 +5404,8 @@ be: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index b562a2c4423..5c9ebef1543 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -109,6 +109,23 @@ bg: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ bg: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: В момента има няма типове на разположение. form: @@ -605,6 +623,9 @@ bg: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ bg: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ bg: create_button: "Създаване" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Неуспешно нулиране на токена за достъп: %{error}" failed_to_create_token: "Неуспешно създаване на токен за достъп: %{error}" failed_to_revoke_token: "Неуспешно нулиране на токена за достъп: %{error}" @@ -725,6 +749,9 @@ bg: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "RSS токенът е изтрит. За да създадете нов токен, използвайте връзката в раздела RSS." notice_ical_token_revoked: 'iCalendar токенът "%{token_name}" за календара "%{calendar_name}" на проекта "%{project_name}" е отменен. URL адресът на iCalendar с този токен, вече е невалиден.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Няма новини за докладване. @@ -1231,6 +1258,10 @@ bg: onthefly: "Automatic user creation" port: "Порт" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Роли" notification: @@ -1489,6 +1520,7 @@ bg: even: "трябва да бъде четно число." exclusion: "е запазено." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "е твърде голям (максимален размер %{count} байта)." filter_does_not_exist: "филтърът не съществува." format: "не съответства на очаквания формат '%{expected}'." @@ -1511,7 +1543,8 @@ bg: not_a_datetime: "не е валидна дата и час." not_a_number: "не е число." not_allowed: "е невалиден поради липса на достъп." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "не е цяло число." not_an_iso_date: "не е валидна дата. Изискван формат: ГГГГ-ММ-ДД." not_same_project: "не принадлежат към един и същ проект." @@ -1919,7 +1952,12 @@ bg: token/api: one: Маркер за достъп other: Токени за достъп - type: "Тип" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Потребител" version: "Версия" workflow: "Работен поток" @@ -2136,6 +2174,7 @@ bg: button_click_to_reveal: "Кликнете, за да разкриете" button_close: "Затворени" button_collapse_all: "Свиване на всички" + button_confirm: "Confirm" button_configure: "Конфигуриране" button_continue: "Продължаване" button_complete: "Complete" @@ -2168,6 +2207,7 @@ bg: button_print: "Отпечатване" button_quote: "Цитат" button_remove: Премахване + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Преименуване" button_replace: "Замени" @@ -2419,7 +2459,7 @@ bg: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ bg: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ bg: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ bg: custom_actions: title: "Персонализирани действия" description: "Потребителските действия са преки пътища с едно кликване до набор от предварително дефинирани действия, които можете да направите достъпни за определени работни пакети въз основа на статус, роля, тип или проект." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ bg: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Потребители на резервни части description: > @@ -2812,19 +2858,17 @@ bg: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ bg: instructions_after_error: "Можете да опитате да влезете отново като щракнете %{signin}. Ако грешката продължава, помолете вашия администратор за помощ." menus: admin: - mail_notification: "Известия по имейл" - mails_and_notifications: "Имейли и известия" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API и уеб куки" + mail_notification: "Известия по имейл" + mails_and_notifications: "Имейли и известия" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Няма налични билети за показване" description: "Всички от тях са забранени. Те могат да бъдат повторно разрешени в меню за администриране." @@ -2909,34 +2956,56 @@ bg: expiration: "Изтича на" indefinite_expiration: "Никога" simple_revoke_confirmation: "Наистина ли искате да анулирате този токен?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "Токените за API позволяват на приложения от трети страни да комуникират с тази инстанция на OpenProject чрез REST API." + static_token_name: "API token" disabled_text: "API токените не са разрешени от администратора. Моля, свържете се с администратора си, за да използвате тази функция." - add_button: "API Token" - api: - static_token_name: "API токен" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "Абонаментите за iCalendar не са разрешени от администратора. Моля, свържете се с администратора си, за да използвате тази функция." - empty_text_hint: "За да добавите токен на iCalendar, абонирайте се за нов или съществуващ календар от модула Календар на проекта. Трябва да имате необходимите разрешения." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "Токените OAuth позволяват на приложения от трети страни да се свързват с тази инстанция на OpenProject." - empty_text_hint: "Няма конфигуриран и активен достъп до приложения на трети страни. Моля, свържете се с вашия администратор, за да активирате тази функция." - rss: - title: "RSS" - text_hint: "RSS токените позволяват на потребителите да следят последните промени в тази инстанция на OpenProject чрез външен RSS четец." - static_token_name: "RSS токен" - disabled_text: "RSS токените не са разрешени от администратора. Моля, свържете се с администратора си, за да използвате тази функция." - storages: - title: "File storages" - text_hint: "Токените за файловите хранилища свързват тази инстанция на OpenProject с външно хранилище на файлове." - empty_text_hint: "С акаунта ви не е свързан достъп до хранилище." - revoke_token: "Наистина ли искате да премахнете този символ? Ще трябва да влезете отново на %{storage}" - removed: "File Storage token successfully removed" + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" + title: "RSS" + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." + storages: unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ bg: label_always_visible: "Винаги се показват" label_announcement: "Известие" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API ключ за достъп" label_api_access_key_created_on: "API ключ за достъп е създаден преди %{value}" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ bg: label_journal_diff: "Сравнение на описание" label_language: "Език" label_languages: "Езици" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Отиди на проект..." label_keyword_plural: "Ключови думи" @@ -3430,9 +3501,6 @@ bg: label_project_hierarchy: "Йерархия на проекта" label_project_mappings: "Проекти" label_project_new: "Нов проект" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Проекти" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ bg: notice_not_authorized: "Нямате право на достъп до тази страница." notice_not_authorized_archived_project: "Проектът, до който се опитвате да получите достъп е бил архивиран." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Паролата ви е неправилна! Не може да продължите!" + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Има намерени %{number} резултата. \n Таб, за да се фокусира първият резултат." notice_principals_found_single: "Резултатът е един. \n Таб, за да го фокусирате." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ bg: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ bg: setting_apiv3_cors_origins_text_html: > Ако CORS е активиран, това са източниците, на които е разрешен достъп до API на OpenProject.
    Моля, проверете Документацията в заглавието Origin за това как да посочите очакваните стойности. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Документация" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ bg: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ bg: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ bg: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ bg: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 12e418b6edd..bf697d1d859 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -109,6 +109,23 @@ ca: explanation: text: "Les accions individuals d'un sol usuari (per exemple actualitzar dos cops un paquet de treball) seran agregades en una sola acció si la diferència temporal és menor a l'especificada. Aquests seran exposats com una acció individual dins l'aplicació. Això, també reduïra el número d'emails enviats i el retràs en el %{webhook_link} ja que les notificacións també seran retrasades." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -588,6 +605,7 @@ ca: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Actualment no hi ha cap classe disponible. form: @@ -602,6 +620,9 @@ ca: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -615,6 +636,7 @@ ca: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -710,9 +732,11 @@ ca: create_button: "Crear" name_label: "Nom del token" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Fallada al reiniciar el token d'accés: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -722,6 +746,9 @@ ca: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "S'ha suprimit el token RSS. Per crear un token nou, utilitzeu l'enllaç de la secció RSS." notice_ical_token_revoked: 'El token d''iCalendar "%{token_name}" per al calendari "%{calendar_name}" en el projecte "%{project_name}" s''ha revocat. L''URL d''iCalendar amb aquest token és ara invàlida.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Actualment no hi ha cap novetat per a informar. @@ -1228,6 +1255,10 @@ ca: onthefly: "Creació d'usuari automàtica" port: "Port" tls_certificate_string: "Servidor LDAP del certificat SSL" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rol" notification: @@ -1486,6 +1517,7 @@ ca: even: "ha de ser parell." exclusion: "està reservat." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "és massa gran (la mida màxima és de %{count} Bytes)." filter_does_not_exist: "el filtre no existeix." format: "no coincideix amb el format esperat '%{expected}'." @@ -1508,7 +1540,8 @@ ca: not_a_datetime: "no és una data-i-hora vàlida." not_a_number: "no és un número." not_allowed: "és invàlid perquè falten permisos." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "no és un enter." not_an_iso_date: "no és una data vàlida. Format requerit: AAAA-MM-DD." not_same_project: "no pertany al mateix projecte." @@ -1916,7 +1949,12 @@ ca: token/api: one: Token d'accés other: Token d'accés - type: "Classe" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Usuari" version: "Versió" workflow: "Flux de treball" @@ -2133,6 +2171,7 @@ ca: button_click_to_reveal: "Clica per mostrar" button_close: "Tanca" button_collapse_all: "Replega-ho tot" + button_confirm: "Confirm" button_configure: "Configurar" button_continue: "Continua" button_complete: "Complete" @@ -2165,6 +2204,7 @@ ca: button_print: "Imprimir" button_quote: "Citar" button_remove: Suprimir + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Renombrar" button_replace: "Substitueix" @@ -2416,7 +2456,7 @@ ca: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2426,10 +2466,12 @@ ca: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2470,8 +2512,8 @@ ca: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2501,6 +2543,8 @@ ca: custom_actions: title: "Accions personalitzades" description: "Les accions personalitzades són accessos ràpids d'un sol clic que et permeten crear accions predefinides en els paquets de treball que desitgis basat en estat, rol, estil o projecte." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2512,6 +2556,8 @@ ca: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Usuaris de marcador de posició description: > @@ -2809,19 +2855,17 @@ ca: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Actualitza a l'edició Enterprise" postgres_migration: "Migrant la teva instal·lació a PostgreSQL" @@ -2889,14 +2933,17 @@ ca: instructions_after_error: "Pots intentar iniciar sessió fent clic a %{signin}. Si l'error continua, demana ajuda al teu administrador." menus: admin: - mail_notification: "Notificacions de correu electrònic" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Agregació" api_and_webhooks: "API i webhooks" + mail_notification: "Notificacions de correu electrònic" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No hi ha tokens d'accés per mostrar" description: "Tots ells s'han dehabilitat. Es poden tornar a habilitar al menú d'administració." @@ -2906,34 +2953,56 @@ ca: expiration: "Caduca" indefinite_expiration: "Mai" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Emmagatzematges de fitxers" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2995,6 +3064,7 @@ ca: label_always_visible: "Sempre es mostren" label_announcement: "Avisos" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Clau d'accés API" label_api_access_key_created_on: "Clau d'accés API creada fa %{value}" label_api_access_key_type: "API" @@ -3250,6 +3320,7 @@ ca: label_journal_diff: "Descripció de comparació" label_language: "Idioma" label_languages: "Idiomes" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Anar al projecte..." label_keyword_plural: "Paraules clau" @@ -3427,9 +3498,6 @@ ca: label_project_hierarchy: "Jerarquia de projectes" label_project_mappings: "Projectes" label_project_new: "Nou projecte" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projectes" label_project_list_plural: "Llistes de projectes" label_project_life_cycle: "Project life cycle" @@ -3890,7 +3958,7 @@ ca: notice_not_authorized: "No tens permís per accedir a aquesta pàgina." notice_not_authorized_archived_project: "El projecte al que intentes accedir està arxivat." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "La teva contrasenya no és correcta, no es pot continuar." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "S'han trobat %{number} resultats.\nPrem per focalitzar el primer resultat." notice_principals_found_single: "S'han trobat un resultat.\nPrem per focalitzar-lo." notice_parent_item_not_found: "Parent item not found." @@ -4240,6 +4308,9 @@ ca: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4252,11 +4323,17 @@ ca: setting_apiv3_cors_origins_text_html: > Si s'activa el CORS, aquests són els orígens que tenen permís per accedir a l'API d'OpenProject.
    Si us plau, valida la Documentació en l'encapçalament d'Origin en com s'ha d'especificar els valors esperats. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Màxima mida de pàgina API" - setting_apiv3_max_page_instructions_html: > - Configura el mida màxima de pàgina amb la qual l'API respondrà. No es permetrà fer peticions d'API que retornin més valors en una única pàgina. Alerta: Si us plau, canvia només aquest valor si estàs segur que ho necessitaràs. Configurant un valor alt resultarà en problemes d'execució mentre que un valor baix pot produir errors en les vistes paginades. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentació" setting_apiv3_docs_enabled: "Activa la pàgina de documents" setting_apiv3_docs_enabled_instructions_html: > @@ -4441,7 +4518,7 @@ ca: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Defineix una llista vàlida d'extensions de fitxers i/o classes MIME per carregar fitxers.
    Introdueïx extensions de fitxers (ex. %{ext_example}) o classes MIME (ex. %{mime_example}).
    Deixa el camp buit per permetre qualsevol classe de fitxer. Es permeten múltiples valors (una línia per cada valor). @@ -4547,7 +4624,7 @@ ca: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4715,6 +4792,7 @@ ca: Nota: si està activat, es mostra un indicador amb l'estat de la teva instal·lació %{information_panel_label} en el panell d'administració i a la pàgina inicial. Només es mostra als administradors.
    L'indicador comprova la teva versió d'OpenProject actual amb la versió oficial i t'avisa si hi ha actualitzacions o qualsevol vulnerabilitat. Per a més informació en quina informació es proveïx, quines dades són necessàries per actualitzacions i com desactivar aquesta funció, si us plau, visita la documentació de configuració. text_own_membership_delete_confirmation: "Estàs a punt d'eliminar algun o tots els teus permisos i potser no podreu editar més aquest projecte.\nEstàs segur que vols continuar?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Es pot escriure als complements actius" text_powered_by: "Desenvolupat per %{link}" text_project_identifier_info: "Només es permeten lletres minúscules (a-z), números, guions i guions baixos, i ha de començar amb una lletra minúscula." @@ -5211,3 +5289,8 @@ ca: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 96abcbac7e4..decbba5bf42 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -109,6 +109,23 @@ ckb-IR: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ ckb-IR: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ ckb-IR: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ ckb-IR: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ ckb-IR: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ ckb-IR: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ ckb-IR: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ ckb-IR: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ ckb-IR: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ ckb-IR: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ ckb-IR: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ ckb-IR: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ ckb-IR: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ ckb-IR: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ ckb-IR: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ ckb-IR: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ ckb-IR: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ ckb-IR: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ ckb-IR: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ ckb-IR: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ ckb-IR: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ ckb-IR: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ ckb-IR: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ ckb-IR: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ ckb-IR: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ ckb-IR: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ ckb-IR: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ ckb-IR: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ ckb-IR: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ ckb-IR: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 36f32e62f93..72ec908ccc7 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -109,6 +109,23 @@ cs: explanation: text: "Individuální akce/úpravy uživatele (např. dvojnásobná aktualizace pracovního balíčku se sečtou do jediné akce, pokud je jejich časový rozdíl menší než stanovený čas. Budou zobrazeny jako jedna akce v rámci aplikace. Toto také zpozdí oznámení o stejný čas a sníží tak počet zasílaných e-mailů a ovlivní se také zpoždění na adrese %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -593,6 +610,7 @@ cs: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: V současné době nejsou k dispozici žádné typy. form: @@ -607,6 +625,9 @@ cs: work_package_priorities: new_label: "nová priorita" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -620,6 +641,7 @@ cs: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -727,9 +749,11 @@ cs: create_button: "Vytvořit" name_label: "Název tokenu" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Nepodařilo se obnovit přístupový token: %{error}" failed_to_create_token: "Nepodařilo se vytvořit přístupový token: %{error}" failed_to_revoke_token: "Nepodařilo se odvolat přístupový token: %{error}" @@ -739,6 +763,9 @@ cs: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "Token API byl odstraněn. Pro vytvoření nového tokenu použijte odkaz v sekci API." notice_ical_token_revoked: 'token iCalendar "%{token_name}" pro kalendář "%{calendar_name}" projektu "%{project_name}" byl zrušen. URL iCalendar s tímto tokenem je nyní neplatná.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: V současné době neexistují žádné zprávy k zobrazení. @@ -1249,6 +1276,10 @@ cs: onthefly: "Automatické vytváření uživatele" port: "Port" tls_certificate_string: "SSL certifikát LDAP serveru" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Role" notification: @@ -1507,6 +1538,7 @@ cs: even: "musí být sudé." exclusion: "vyhrazeno." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "je příliš velký (maximální velikost je %{count} Bajtů)." filter_does_not_exist: "Filtr neexistuje." format: "neodpovídá očekávanému formátu '%{expected}'." @@ -1529,7 +1561,8 @@ cs: not_a_datetime: "není platný čas." not_a_number: "není číslo." not_allowed: "je neplatný z důvodu chybějících oprávnění." - not_json: "není platný objekt JSON." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "není celé číslo." not_an_iso_date: "není platné datum. Požadovaný formát: RRRR-MM-DD." not_same_project: "nepatří do stejného projektu." @@ -1963,7 +1996,16 @@ cs: few: Přístupové tokeny many: Přístupové tokeny other: Přístupové tokeny - type: "Typ" + token/rss: + one: "RSS token" + few: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + many: "Types" + other: "Types" user: "Uživatel" version: "Verze" workflow: "Pracovní postup" @@ -2188,6 +2230,7 @@ cs: button_click_to_reveal: "Kliknutím zobrazíte" button_close: "Zavřít" button_collapse_all: "Sbalit vše" + button_confirm: "Confirm" button_configure: "Přizpůsobit" button_continue: "Pokračovat" button_complete: "Complete" @@ -2220,6 +2263,7 @@ cs: button_print: "Tisk" button_quote: "Citovat" button_remove: Odstranit + button_remove_permanently: "Remove permanently" button_remove_reminder: "Odstranit připomenutí" button_rename: "Přejmenovat" button_replace: "Nahradit" @@ -2511,7 +2555,7 @@ cs: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2521,10 +2565,12 @@ cs: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2565,8 +2611,8 @@ cs: description: "Vytváření automaticky generovaných předmětů pomocí odkazovaných atributů a textu." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2596,6 +2642,8 @@ cs: custom_actions: title: "Vlastní akce" description: "Vlastní akce jsou zkratky jedním kliknutím na sadu předem definovaných akcí, které můžete zpřístupnit na základě stavu některých pracovních balíčků. role, typ nebo projekt." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2607,6 +2655,8 @@ cs: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Zajistěte, aby nahrané soubory v OpenProjectu byly před zpřístupněním ostatním uživatelům zkontrolovány na přítomnost virů." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder uživatel description: > @@ -2906,19 +2956,17 @@ cs: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgradovat na Enterprise Edici" postgres_migration: "Migrujte vaši instalaci na PostgreSQL" @@ -2986,14 +3034,17 @@ cs: instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc." menus: admin: - mail_notification: "E-mailové notifikace" - mails_and_notifications: "E-maily a oznámení" + ai: "Artificial Intelligence (AI)" aggregation: "Agregace" api_and_webhooks: "API & Webhooky" + mail_notification: "E-mailové notifikace" + mails_and_notifications: "E-maily a oznámení" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Žádné přístupové tokeny k zobrazení" description: "Všechny byly zakázány. Znovu povoleny mohou být v nabídce administrace." @@ -3003,34 +3054,56 @@ cs: expiration: "Vyprší" indefinite_expiration: "Nikdy" simple_revoke_confirmation: "Opravdu chcete zrušit tento token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "OAuth tokeny umožňují aplikacím třetích stran spojení s touto instancí OpenProjekt." + static_token_name: "API token" disabled_text: "API tokeny nejsou administrátorem povoleny. Pro použití této funkce kontaktujte svého správce." - add_button: "API Token" - api: - static_token_name: "API Token" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar odběr není administrátorem povolen. Pro použití této funkce kontaktujte svého správce." - empty_text_hint: "Chcete-li přidat token iCalendar, přihlaste se do nového nebo existujícího kalendáře v rámci modulu kalendáře projektu. Musíte mít potřebná oprávnění." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokeny umožňují aplikacím třetích stran spojení s touto instancí OpenProjekt." - empty_text_hint: "Pro vás není nastaven a aktivní přístup třetí strany. Pro aktivaci této funkce kontaktujte svého správce." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "RSS tokeny umožňují uživatelům držet krok s nejnovějšími změnami v této OpenProject instanci přes externí RSS čtečku." + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" - disabled_text: "API tokeny nejsou administrátorem povoleny. Pro použití této funkce kontaktujte svého správce." + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Úložiště souborů" - text_hint: "Tokeny úložiště souborů připojují tuto OpenProject instanci s externím úložištěm souborů." - empty_text_hint: "K vašemu účtu není připojen žádný přístup k úložišti." - revoke_token: "Opravdu chcete odstranit tento token? Budete se muset znovu přihlásit na %{storage}" - removed: "Token Úložiště souborů byl úspěšně odstraněn" - failed: "Došlo k chybě a token nemohl být odstraněn. Opakujte akci později." unknown_storage: "Neznámé úložiště" notifications: reasons: @@ -3092,6 +3165,7 @@ cs: label_always_visible: "Vždy zobrazovat" label_announcement: "Oznámení" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Přístupový klíč pro API" label_api_access_key_created_on: "API přístupový klíč vytvořen před %{value}" label_api_access_key_type: "API" @@ -3347,6 +3421,7 @@ cs: label_journal_diff: "Popis porovnání" label_language: "Jazyk" label_languages: "Jazyky" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Přejít na projekt..." label_keyword_plural: "Klíčová slova" @@ -3524,9 +3599,6 @@ cs: label_project_hierarchy: "Hierarchie projektu" label_project_mappings: "Projekty" label_project_new: "Nový projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekty" label_project_list_plural: "Seznamy projektů" label_project_life_cycle: "Životní cyklus projektu" @@ -3991,7 +4063,7 @@ cs: notice_not_authorized: "Nemáte oprávnění k přístupu na tuto stránku." notice_not_authorized_archived_project: "Projekt, na který se pokoušíte přistoupit byl archivován." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Heslo není správné. Nelze pokračovat." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Nalezeno %{number} výsledků. \nStiskněte Tab pro přechod na první výsledek." notice_principals_found_single: "Existuje jeden výsledek. \n Záložka pro zaměření." notice_parent_item_not_found: "Parent item not found." @@ -4346,6 +4418,9 @@ cs: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4358,11 +4433,17 @@ cs: setting_apiv3_cors_origins_text_html: > Pokud je funkce CORS povolena, je to původ, který má přístup k OpenProject API.
    Zkontrolujte Dokumentaci na záhlaví Origin o tom, jak specifikovat očekávané hodnoty. setting_apiv3_write_readonly_attributes: "Přístup k atributům pouze pro čtení" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximální velikost stránky API" - setting_apiv3_max_page_instructions_html: > - Nastavte maximální velikost stránky, se kterou bude API reagovat. Nebude možné provádět API požadavky, které vracejí více hodnot na jedné stránce.
    Varování: Změňte tuto hodnotu pouze pokud jste si jisti, proč ji potřebujete. Nastavení na vysokou hodnotu bude mít výrazný dopad na výkon, zatímco hodnota nižší, než jsou možnosti na stránce, způsobí chyby v stránkovaných zobrazeních. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentace" setting_apiv3_docs_enabled: "Povolit stránku dokumentace" setting_apiv3_docs_enabled_instructions_html: > @@ -4547,7 +4628,7 @@ cs: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Definujte seznam platných přípon souborů a/nebo mime typů pro nahrané soubory.
    Zadejte přípony souborů (např. %{ext_example}) nebo mime typy (např. ., %{mime_example}).
    Ponechte prázdné pro nahrání jakéhokoli typu souboru. Povoleno více hodnot (jeden řádek pro každou hodnotu). @@ -4653,7 +4734,7 @@ cs: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4821,6 +4902,7 @@ cs: Poznámka: Pokud je povoleno, bude zobrazen odznak se stavem instalace v %{information_panel_label} administrativním panelu, a na domovské stránce. Zobrazuje se pouze administrátorům.
    Odznak zkontroluje vaši aktuální verzi OpenProject proti oficiální databázi OpenProject release, aby vás upozornil na jakékoliv aktualizace nebo známá slabá místa. Pro více informací o tom, co kontrola stanoví, jaké údaje jsou potřebné k poskytnutí dostupných aktualizací, a jak tuto kontrolu zakázat, navštivte konfigurační dokumentaci. text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechna svá oprávnění, potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?" text_permanent_delete_confirmation_checkbox_label: "Beru na vědomí, že toto vymazání nelze vzít zpět." + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Zapisovatelný adresář aktiv pluginu" text_powered_by: "Běží na %{link}" text_project_identifier_info: "Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka. Musí začínat malým písmenem." @@ -5320,3 +5402,8 @@ cs: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index a8760d18080..1ffe1439150 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -109,6 +109,23 @@ da: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -589,6 +606,7 @@ da: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Der er i øjeblikket ingen tilgængelige typer. form: @@ -603,6 +621,9 @@ da: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -616,6 +637,7 @@ da: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -711,9 +733,11 @@ da: create_button: "Opret" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -723,6 +747,9 @@ da: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1229,6 +1256,10 @@ da: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rollee" notification: @@ -1487,6 +1518,7 @@ da: even: "skal være lige." exclusion: "er reserveret." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "er for stor (maks. størrelse er %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1509,7 +1541,8 @@ da: not_a_datetime: "is not a valid date time." not_a_number: "er ikke et tal." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "er ikke et heltal." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "hører ikke til samme projekt." @@ -1917,7 +1950,12 @@ da: token/api: one: Adgangstegn other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Bruger" version: "Version" workflow: "Arbejdsgang" @@ -2134,6 +2172,7 @@ da: button_click_to_reveal: "Click to reveal" button_close: "Luk" button_collapse_all: "Fold alle sammen" + button_confirm: "Confirm" button_configure: "Opsæt" button_continue: "Fortsæt" button_complete: "Complete" @@ -2166,6 +2205,7 @@ da: button_print: "Print" button_quote: "Citer" button_remove: Fjern + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Omdøb" button_replace: "Replace" @@ -2417,7 +2457,7 @@ da: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2427,10 +2467,12 @@ da: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2471,8 +2513,8 @@ da: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2502,6 +2544,8 @@ da: custom_actions: title: "Brugerdefinerede handlinger" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2513,6 +2557,8 @@ da: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Pladsholder brugere description: > @@ -2810,19 +2856,17 @@ da: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2890,14 +2934,17 @@ da: instructions_after_error: "Du kan forsøge at logge ind igen ved at klikke %{signin}. Hvis fejlen stadig opstår, spørg da admin. efter hjælp." menus: admin: - mail_notification: "E-mail-påmindelser" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "E-mail-påmindelser" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Ingen adgangstegn til at vise" description: "De er alle blevet deaktiveret. De kan genaktiveres i administrationsmenuen." @@ -2907,34 +2954,56 @@ da: expiration: "Udløber" indefinite_expiration: "Aldrig" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2996,6 +3065,7 @@ da: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API adgangsnøgle" label_api_access_key_created_on: "API adgangsnøgle oprettet for %{value} siden" label_api_access_key_type: "API" @@ -3251,6 +3321,7 @@ da: label_journal_diff: "Sammenligning af beskrivelser" label_language: "Sprog" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Gå til et projekt..." label_keyword_plural: "Keywords" @@ -3428,9 +3499,6 @@ da: label_project_hierarchy: "Projekthierarki" label_project_mappings: "Projekter" label_project_new: "Nyt projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekter" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3894,7 +3962,7 @@ da: notice_not_authorized: "Du har ikke tilladelser til at gå til denne side." notice_not_authorized_archived_project: "Det projekt du forsøger at tilgå er blevet arkiveret." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4245,6 +4313,9 @@ da: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4257,11 +4328,17 @@ da: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4446,7 +4523,7 @@ da: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4552,7 +4629,7 @@ da: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4720,6 +4797,7 @@ da: 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: "Du er ved at fjerne nogle af, eller alle dine tilladelser og vil muligvis ikke kunne redigere projektet herefter.\nEr du sikker på, du vil fortsætte?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Brug af plugin forudsætter at dette arkiv er skrivbart" text_powered_by: "Drevet af %{link}" text_project_identifier_info: "Kun små bogstaver (a-z), tal, - og _ er tilladt; først tegn skal være et bogstav." @@ -5216,3 +5294,8 @@ da: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 765edd55403..8ce289d11cf 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -109,6 +109,23 @@ de: explanation: text: "Individuelle Aktionen eines Benutzers (z.B. ein Arbeitspaket zweimal aktualisieren) werden zu einer einzigen Aktion zusammengefasst, wenn ihr Altersunterschied kleiner ist als der angegebene Zeitraum. Sie werden als eine einzige Aktion innerhalb der Anwendung angezeigt. Dadurch werden Benachrichtigungen um die gleiche Zeit verzögert, wodurch die Anzahl der gesendeten E-Mails verringert wird. Dies wirkt sich auch auf die Verzögerung von %{webhook_link} aus." link: "Webhook" + mcp_configurations: + index: + description: "Das Model Context Protocol ermöglicht es KI-Agenten, ihren Nutzern Tools und Ressourcen bereitzustellen, die diese OpenProject-Instanz zur Verfügung stellt." + resources_heading: "Ressourcen" + resources_description: "OpenProject stellt die folgenden Ressourcen bereit. Jede Ressource kann nach Wunsch aktiviert, umbenannt und beschrieben werden. Weitere Informationen finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url)." + resources_submit: "Ressourcen aktualisieren" + tools_heading: "Tools" + tools_description: "OpenProject stellt die folgenden Tools bereit. Jedes Tool kann nach Wunsch aktiviert, umbenannt und beschrieben werden. Weitere Informationen finden sich in der [Dokumentation zu MCP-Ressourcen](docs_url)." + tools_submit: "Tools aktualisieren" + multi_update: + success: "MCP-Konfigurationen wurden erfolgreich aktualisiert." + server_form: + description_caption: "Wie der MCP-Server gegenüber anderen Anwendungen beschrieben wird, die sich damit verbinden." + title_caption: "Ein kurzer Titel, der Anwendungen angezeigt wird, die sich mit dem MCP-Server verbinden." + update: + failure: "Die MCP-Konfiguration konnte nicht aktualisiert werden." + success: "Die MCP-Konfiguration wurde erfolgreich aktualisiert." scim_clients: authentication_methods: sso: "JWT vom Identitätsanbieter" @@ -588,6 +605,7 @@ de: is_for_all_blank_slate: heading: Für alle Projekte description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne Projekte deaktiviert werden. + enabled_via_assignee_when_submitted_html: Dieses Projektattribut kann nicht deaktiviert werden, da es bei Projektinitiierungsanträgen als Zuweisung bei Einreichung verwendet wird. types: no_results_title_text: Derzeit stehen keine Typen zur Verfügung. form: @@ -602,6 +620,9 @@ de: work_package_priorities: new_label: "Neue Priorität" creation_wizard: + errors: + no_work_package_type: "Die Anfrage zur Projektinitiierung konnte nicht aktiviert werden, da dafür mindestens ein aktiver Arbeitspaket-Typ erforderlich ist und dieses Projekt keinen hat. Bitte fügen Sie diesem Projekt mindestens einen Arbeitspaket-Typ hinzu." + no_status_when_submitted: "Der Antrag auf Projektinitiierung konnte nicht aktiviert werden, da für den Arbeitspaket-Typ %{type} mindestens ein Status erforderlich ist, der mit ihm verknüpft ist. Bitte aktivieren Sie mindestens einen Status-Workflow für diesen Arbeitspaket-Typ." export: description_attachment_export: "Das erzeugte Artefakt wird als PDF-Anhang zum erstellten Arbeitspaket gespeichert." description_file_link_export: "Das erstellte Arbeitspaket enthält einen Dateilink zu einer PDF-Datei, die in einem externen Dateispeicher gespeichert ist. Erfordert einen aktiven Dateispeicher mit automatisch verwalteten Projektordnern. Im Moment werden nur Nextcloud-Dateispeicher unterstützt." @@ -615,6 +636,7 @@ de: label_request_submission: "Einreichung des Antrags" project_attributes_description: > Wählen Sie aus, welche Attribute in den Projektinitiierungsantrag aufgenommen werden sollen. Diese Liste zeigt nur [Projektattribute](project_attributes_url), die für dieses Projekt aktiviert sind. + enabled_because_required_html: Dieses Projektattribut kann für diesen Projektinitiierungsantrag nicht deaktiviert werden, da es als erforderlich definiert ist. Dies kann in den Administrationseinstellungen vom Administrator der Instanz geändert werden. status: button_edit: Status bearbeiten wizard: @@ -710,9 +732,11 @@ de: create_button: "Anlegen" name_label: "Token-Name" created_dialog: + one_time_warning: "Dies ist das einzige Mal, dass dieses Token angezeigt wird. Stellen Sie sicher, dass Sie es jetzt kopieren." token/api: title: "Der API-Token wurde generiert" - warning: "Dies ist das einzige Mal, dass dieses Token angezeigt wird. Stellen Sie sicher, dass Sie es jetzt kopieren." + token/rss: + title: "Das RSS-Token wurde generiert" failed_to_reset_token: "Zusatztoken konnte nicht zurückgesetzt werden: %{error}" failed_to_create_token: "Zugriffstoken konnte nicht erstellt werden: %{error}" failed_to_revoke_token: "Zugriffstoken kann nicht widerrufen werden: %{error}" @@ -722,6 +746,9 @@ de: notice_api_token_revoked: "Das API-Token wurde gelöscht. Nutzen Sie bitte den Knopf in der API-Sektion für die Erstellung eines neues Token. " notice_rss_token_revoked: "Der RSS-Token wurde gelöscht. Um ein neues Token zu erstellen, benutzen Sie bitte den Link im RSS-Bereich." notice_ical_token_revoked: 'iCalendar-Token „%{token_name}“ für Kalender „%{calendar_name}“ des Projekts „%{project_name}“ wurde widerrufen. Die iCal-URL mit diesem Token ist jetzt ungültig.' + password_confirmation_dialog: + confirmation_required: "Sie müssen Ihr Passwort eingeben, um diese Änderung zu bestätigen." + title: "Bestätigen Sie Ihr Passwort um fortzufahren" news: index: no_results_title_text: Es gibt aktuell keine Neuigkeiten. @@ -1223,6 +1250,10 @@ de: onthefly: "Benutzer automatisch erzeugen" port: "Port" tls_certificate_string: "LDAP-Server SSL-Zertifikat" + mcp_configuration: + enabled: Aktiviert + title: Titel + description: Beschreibung member: roles: "Rollen" notification: @@ -1481,6 +1512,7 @@ de: even: "muss gerade sein." exclusion: "ist nicht verfügbar." feature_disabled: ist nicht verfügbar. + feature_disabled_for_project: ist für dieses Projekt deaktiviert. file_too_large: "ist zu groß (nicht mehr als %{count} Bytes erlaubt)." filter_does_not_exist: "Filter existiert nicht." format: "stimmt nicht mit dem erwarteten Format '%{expected} ' überein." @@ -1503,7 +1535,8 @@ de: not_a_datetime: "ist kein gültiges Datum." not_a_number: "ist keine Zahl." not_allowed: "ist ungültig aufgrund fehlender Berechtigungen." - not_json: "ist kein gültiges JSON-Objekt." + not_json: "konnte nicht als JSON gelsen werden." + not_json_object: "ist kein gültiges JSON-Objekt." not_an_integer: "ist keine ganzzahlige Zahl." not_an_iso_date: "ist kein gültiges Datum - Erwartetes Format: YYY-MM-DD." not_same_project: "gehört nicht zum selben Projekt." @@ -1911,7 +1944,12 @@ de: token/api: one: Zugangs-Token other: Zugangs-Token - type: "Typ" + token/rss: + one: "RSS-Token" + other: "RSS-Token" + type: + one: "Typ" + other: "Typen" user: "Benutzer" version: "Version" workflow: "Workflow" @@ -2128,6 +2166,7 @@ de: button_click_to_reveal: "Klicke, um anzuzeigen" button_close: "Schließen" button_collapse_all: "Alle zuklappen" + button_confirm: "Bestätigen" button_configure: "Konfigurieren" button_continue: "Fortfahren" button_complete: "Fertigstellen" @@ -2160,6 +2199,7 @@ de: button_print: "Drucken" button_quote: "Zitieren" button_remove: Entfernen + button_remove_permanently: "Endgültig löschen" button_remove_reminder: "Erinnerung entfernen" button_rename: "Umbenennen" button_replace: "Ersetzen" @@ -2411,7 +2451,7 @@ de: baseline_comparison: Grundlinie (Planungsvergleich) board_view: Erweiterte agile Boards calculated_values: Berechnete Werte - conditional_highlighting: Bedingte Hervorhebung + capture_external_links: Externe Links abfangen internal_comments: Interne Kommentare custom_actions: Benutzerdefinierte Aktionen custom_field_hierarchies: Hierarchien @@ -2421,10 +2461,12 @@ de: edit_attribute_groups: Attributgruppen bearbeiten gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP-Benutzer- und Gruppensynchronisation + mcp_server: MCP-Server nextcloud_sso: Single Sign-On für Nextcloud-Speicher one_drive_sharepoint_file_storage: OneDrive/SharePoint-Datei-Speicher placeholder_users: Platzhalter-Benutzer portfolio_management: Portfolioverwaltung + project_creation_wizard: Projektinitiierungsantrag project_list_sharing: Projektlistenfreigabe readonly_work_packages: Schreibgeschützte Arbeitspakete scim_api: SCIM-Server-API @@ -2465,8 +2507,8 @@ de: description: "Erstellen Sie automatisch generierte Betreffe mit referenzierten Attributen und Text." customize_life_cycle: description: "Erstellen und organisieren Sie von PM2 abweichende Projektlebenszyklen." - conditional_highlighting: - description: "Benötigen Sie bestimmte Arbeitspakete, um sich von der Masse abzuheben? Verwenden Sie die bedingte Hervorhebung in der Arbeitspaketstabelle." + capture_external_links: + description: "Verhindern Sie Social-Engineering-Angriffe, indem Sie externe Links erfassen und davor warnen, bevor Benutzer sie besuchen." work_package_query_relation_columns: description: "Möchten Sie Beziehungen oder Unteraufgaben als Spalten in der Arbeitspaketliste sehen können?" edit_attribute_groups: @@ -2496,6 +2538,8 @@ de: custom_actions: title: "Benutzerdefinierte Aktionen" description: "Selbstdefinierte Aktionen sind Verknüpfungen zu einer Reihe von vordefinierten Aktionen, die Sie für bestimmte Arbeitspakete je nach Status, Rolle, Typ oder Projekt mit nur einem Klick auf einen Button auslösen." + mcp_server: + description: "Integrieren Sie KI-Agenten mit Ihrer OpenProject-Instanz über MCP." nextcloud_sso: title: "Single Sign-On für Nextcloud-Speicher" description: "Aktivieren Sie nahtlose und sichere Authentifizierung für Ihren Nextcloud-Speicher mit Single Sign-On. Vereinfachen Sie das Zugriffsmanagement und erhöhen Sie den Benutzerkomfort." @@ -2507,6 +2551,8 @@ de: description: "Ermöglichen Sie es Benutzern, sich über externe SSO-Anbieter mit SAML oder OpenID Connect anzumelden, um einen nahtlosen Zugriff und die Integration mit bestehenden Identitätssystemen zu ermöglichen." virus_scanning: description: "Stellen Sie sicher, dass hochgeladene Dateien in OpenProject auf Viren gescannt werden, bevor sie für andere Benutzer zugänglich sind." + project_creation_wizard: + description: "Generieren Sie einen Schritt-für-Schritt-Assistenten, um Projektmanagern dabei zu helfen, einen Projektinitiierungsantrag auszufüllen." placeholder_users: title: Platzhalter-Konten description: > @@ -2804,19 +2850,17 @@ de: learn_about: "Erfahren Sie mehr über die neuen Funktionen" missing: "Es gibt noch keine hervorgehobenen Funktionen." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > Dieses Release enthält verschiedene neue Funktionen und Verbesserungen, wie z. B: new_features_list: - line_0: Zusammenarbeit an Dokumenten in Echtzeit. - line_1: Strukturierung zusammenhängender Projekte in Programme und Portfolios, um sie auf strategische Ziele auszurichten (Enterprise Add-on). - line_2: Bessere Verwaltung von Besprechungen mit Entwurfsmodus, Präsentationsmodus, verbesserten Ergebnissen und iCal-Abonnement. - line_3: Aktualisierte SharePoint-Integration mit flexibleren Berechtigungen (Enterprise Add-on). - line_4: Neu gestaltete Projektübersicht mit neuen Tabs, konfigurierbaren Widgets und einem verbesserten Layout. - line_5: Option zum Trennen der Sichtbarkeit von Benutzern innerhalb der Instanz, die nicht am selben Projekt oder derselben Gruppe arbeiten. - line_6: Verbesserter Ablauf der Projekterstellung mit neuer Vorlagenauswahl. - line_7: Eine intelligentere Suche, die Typ und Status einschließt, verbessert die Präzision in der globalen Suche und in Auswahlfeldern. - line_8: Verbesserungen der Zugänglichkeit mit ALT-Texten und verbesserten Diagrammfarben. + line_0: Automatisierte Projektinitiierung (Enterprise Add-on). + line_1: "Besprechungen: Fügen Sie neue oder bestehende Arbeitspakete als Ergebnisse hinzu." + line_2: "Besprechungen: iCal-Antworten in OpenProject anzeigen." + line_3: "Wiederkehrende Besprechungen: Kopieren Sie Tagesordnungspunkte zur nächsten Besprechung." + line_4: "Freigabe für die Community-Edition: Hervorhebung von Attributen." + line_5: Warnung vor dem Öffnen externer Links in von Benutzern erstellten Texten (Enterprise Add-on). + line_6: Verbesserte Leistung und Benutzerfreundlichkeit, einschließlich des Aktivität-Tabs und des Dokumenten-Moduls. links: upgrade_enterprise_edition: "Auf Enterprise Edition upgraden" postgres_migration: "Migration Ihrer Installation zu PostgreSQL" @@ -2884,14 +2928,17 @@ de: instructions_after_error: "Sie können versuchen sich erneut anzumelden indem Sie auf %{signin} klicken. Wenn der Fehler weiterhin auftritt, fragen Sie Ihren Administrator um Hilfe." menus: admin: - mail_notification: "Mailbenachrichtigung" - mails_and_notifications: "E-Mails und Benachrichtigungen" + ai: "Künstliche Intelligenz (AI)" aggregation: "Zusammenfassungen" api_and_webhooks: "API und Webhooks" + mail_notification: "Mailbenachrichtigung" + mails_and_notifications: "E-Mails und Benachrichtigungen" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Hinzufügen…" my_account: access_tokens: + description: "Provider-Tokens werden von OpenProject ausgestellt und ermöglichen anderen Anwendungen den Zugriff darauf. Client-Tokens werden von anderen Anwendungen ausgestellt und ermöglichen OpenProject den Zugriff auf sie." no_results: title: "Kein Zugangs-Token kann angezeigt werden" description: "Alle wurden deaktiviert. Sie können im Administrations-Menü wieder aktiviert werden." @@ -2901,34 +2948,56 @@ de: expiration: "Läuft aus" indefinite_expiration: "Nie" simple_revoke_confirmation: "Sind Sie sicher, dass Sie dieses Token widerrufen möchten?" + tabs: + client: + title: "Client-Tokens" + provider: + title: "Provider-Tokens" token/api: + blank_description: "Es gibt noch kein API-Token. Sie können eines erstellen, indem Sie auf die Schaltfläche unten klicken." + blank_title: "Kein API-Token" title: "Schnittstelle (API)" + table_title: "API-Token" text_hint: "API-Token erlauben es Drittanbieter-Anwendungen, mit dieser OpenProject-Instanz über REST-APIs zu kommunizieren." + static_token_name: "API-Token" disabled_text: "API-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." add_button: "API-Token" - api: - static_token_name: "API-Token" ical: + blank_description: "Um einen iCalendar-Token hinzuzufügen, abonnieren Sie einen neuen oder bestehenden Kalender innerhalb des Kalender-Moduls eines Projekts. Sie müssen über die erforderlichen Berechtigungen verfügen." + blank_title: "Kein iCalendar-Token" title: "iCalendar" + table_title: "iCalendar-Token" text_hint_link: "iCalendar-Token ermöglichen es Benutzern, [OpenProject-Kalender zu abonnieren](docs_url) und aktuelle Arbeitspaketinformationen in externen Anwendungen anzuzeigen." disabled_text: "iCalendar Abonnements sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." - empty_text_hint: "Um einen iCalendar Token hinzuzufügen, abonnieren Sie einen neuen oder bestehenden Kalender innerhalb des Kalender-Moduls eines Projekts. Sie müssen über die erforderlichen Berechtigungen verfügen." - oauth: + oauth_application: + active_tokens: "Aktive Token" + blank_description: "Für Sie ist kein Zugriff auf Anwendungen von Drittanbietern konfiguriert und aktiv." + blank_title: "Kein OAuth-Anwendungs-Token" + last_used_at: "Zuletzt verwendet am" title: "OAuth" - text_hint: "OAuth Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser OpenProject Instanz zu verbinden." - empty_text_hint: "Für Sie ist kein Zugriff auf die Anwendung von Drittanbietern konfiguriert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu aktivieren." - rss: + table_title: "OAuth-Anwendungs-Tokens" + text_hint: "OAuth-Tokens erlauben es Drittanbieter-Anwendungen, sich mit dieser OpenProject Instanz zu verbinden." + oauth_client: + blank_description: "Es gibt noch keine OAuth-Client-Tokens." + blank_title: "Keine OAuth-Client-Tokens" + failed: "Ein Fehler ist aufgetreten und das Token konnte nicht entfernt werden. Bitte versuchen Sie es später erneut." + integration_type: "Integrations-Typ" + table_title: "Keine OAuth-Client-Tokens" + text_hint: "OAuth-Client-Tokens ermöglichen es dieser OpenProject-Instanz, sich mit externen Anwendungen zu verbinden, z. B. mit Dateispeichern." + title: "OAuth" + remove_token: "Möchten Sie dieses Token wirklich entfernen? Sie müssen sich erneut bei %{integration} anmelden." + removed: "OAuth-Client-Token erfolgreich entfernt" + unknown_integration: "Unbekannt" + token/rss: + add_button: "RSS-Token" + blank_description: "Es gibt noch kein RSS-Token. Sie können eines erstellen, indem Sie auf die Schaltfläche unten klicken." + blank_title: "Kein RSS-Token" title: "RSS" + table_title: "RSS-Token" text_hint: "RSS-Token erlauben es Benutzern über einen externen RSS-Reader auf dem Laufenden zu bleiben." static_token_name: "RSS-Token" disabled_text: "RSS-Token sind vom Administrator nicht aktiviert. Bitte kontaktieren Sie Ihren Administrator, um diese Funktion zu nutzen." storages: - title: "Dateispeicher" - text_hint: "Dateispeicher-Tokens verbinden diese OpenProject Instanz mit einem externen Dateispeicher." - empty_text_hint: "Es gibt keinen Dateispeicher, der mit Ihrem Konto verknüpft ist." - revoke_token: "Möchten Sie dieses Token wirklich entfernen? Sie müssen sich erneut bei %{storage} anmelden" - removed: "Dateispeicher-Token erfolgreich entfernt" - failed: "Ein Fehler ist aufgetreten und das Token konnte nicht entfernt werden. Bitte versuchen Sie es später erneut." unknown_storage: "Unbekannter Speicher" notifications: reasons: @@ -2990,6 +3059,7 @@ de: label_always_visible: "Immer angezeigt" label_announcement: "Ankündigung" label_angular: "AngularJS" + label_app_modules: "%{app_title} Module" label_api_access_key: "API-Zugriffsschlüssel" label_api_access_key_created_on: "Der API-Zugriffsschlüssel wurde vor %{value} erstellt" label_api_access_key_type: "Schnittstelle (API)" @@ -3245,6 +3315,7 @@ de: label_journal_diff: "Beschreibungsvergleich" label_language: "Sprache" label_languages: "Sprachen" + label_external_links: "Externe Links" label_locale: "Sprache und Region" label_jump_to_a_project: "Zu einem Projekt springen..." label_keyword_plural: "Schlüsselwörter" @@ -3422,9 +3493,6 @@ de: label_project_hierarchy: "Projekthierarchie" label_project_mappings: "Projekte" label_project_new: "Neues Projekt" - label_project_initiation_request: "Neuer Projektinitiierungsantrag" - label_project_creation_wizard: "Neuer Projekterstellungs-Assistent" - label_project_mandate: "Neues Projektmandat" label_project_plural: "Projekte" label_project_list_plural: "Projektlisten" label_project_life_cycle: "Projekt-Lebenszyklus" @@ -3888,7 +3956,7 @@ de: notice_not_authorized: "Sie sind nicht berechtigt, auf diese Seite zuzugreifen." notice_not_authorized_archived_project: "Das Projekt wurde archiviert und ist daher nicht verfügbar." notice_requires_enterprise_token: "Kein Enterprise-Token vorhanden oder das vorhandene Token erlaubt keinen Zugriff auf diese Seite." - notice_password_confirmation_failed: "Ihr Passwort ist nicht korrekt. Kann nicht fortgesetzt werden." + notice_password_confirmation_failed: "Das eingegebene Passwort ist nicht korrekt." notice_principals_found_multiple: "Es wurden %{number} Ergebnisse gefunden.\nDrücke Tab um das erste Ergebnis zu fokussieren." notice_principals_found_single: "Es wurde ein Ergebnis gefunden.\nDrücke Tab um es zu fokussieren." notice_parent_item_not_found: "Übergeordnetes Element nicht gefunden." @@ -4241,6 +4309,9 @@ de: setting_allowed_link_protocols: "Erlaubte Link-Protokolle" setting_allowed_link_protocols_text_html: >- Erlauben Sie es, diese Protokolle als Links in Arbeitspaket-Beschreibungen, langen Textfeldern und Kommentaren darzustellen. Zum Beispiel %{tel_code} oder %{element_code}. Geben Sie ein Protokoll pro Zeile ein.
    Protokolle %{http_code}, %{https_code} und %{mailto_code} sind immer erlaubt. + setting_capture_external_links: "Externe Links abfangen" + setting_capture_external_links_text: > + Wenn diese Funktion aktiviert ist, werden alle externen Links in formatiertem Text auf eine vor dem Link warnende Seite in der Applikation umgeleitet, bevor sie die Anwendung verlassen. Dies hilft, Benutzer vor potenziell bösartigen externen Websites zu schützen. setting_after_first_login_redirect_url: "Weiterleitung nach erster Anmeldung" setting_after_first_login_redirect_url_text_html: > Legen Sie einen Pfad fest, an den Nutzer:innen nach der ersten Anmeldung weitergeleitet werden. Wenn leer, führt er auf die Startseite des Onboarding-Tours.
    Beispiel: /meine/seite @@ -4253,11 +4324,17 @@ de: setting_apiv3_cors_origins_text_html: > Wenn CORS aktiviert ist, sind dies die Origins, die auf die OpenProject API zugreifen dürfen.
    Bitte überprüfen Sie die Dokumentation über den Origin Header, wie die Werte anzugeben sind. setting_apiv3_write_readonly_attributes: "Schreibzugriff auf schreibgeschützte Attribute" - setting_apiv3_write_readonly_attributes_instructions_html: > - Diese Option erlaubt API Administratoren, bei der Erstellung statische schreibgeschützte Attribute wie createdAt und author zu schreiben.
    Warnung: Diese Einstellung ist z.B. für den Import von Daten nützlich, ermöglicht es aber Administratoren, sich bei der Erstellung von Objekten als andere Benutzer auszugeben. Alle Anfragen werden jedoch immer auch mit dem wahren Autor protokolliert.
    Weitere Informationen zu Attributen und unterstützten Ressourcen finden Sie unter %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Wenn diese Option aktiviert ist, erlaubt die API Administratoren, bei der Erstellung statische schreibgeschützte Attribute wie createdAt und author zu schreiben. + setting_apiv3_write_readonly_attributes_warning: > + Diese Einstellung ist z.B. für den Import von Daten nützlich, ermöglicht es aber auch Administratoren, sich bei der Erstellung von Artikeln als andere Benutzer auszugeben. Alle Erstellungsanfragen werden jedoch mit dem wahren Autor protokolliert. + setting_apiv3_write_readonly_attributes_additional: > + Weitere Informationen zu Attributen und unterstützten Ressourcen finden Sie unter %{api_documentation_link}. setting_apiv3_max_page_size: "Maximale API-Seitengröße" - setting_apiv3_max_page_instructions_html: > - Legen Sie die maximale Seitengröße fest, mit der die API antworten soll. Es wird nicht möglich sein, API-Anfragen durchzuführen, die mehr Werte auf einer einzelnen Seite zurückgeben.
    Warnung: Bitte ändern Sie diesen Wert nur, wenn Sie sicher sind, warum Sie ihn benötigen. Die Einstellung auf einen hohen Wert führt zu erheblichen Performance-Auswirkungen, während ein Wert niedriger als die Einstellung "Objekte pro Seite" zu Fehlern in paginierten Ansichten führt. + setting_apiv3_max_page_size_instructions: > + Legen Sie die maximale Anzahl von Ressourcen fest, mit der die API antworten wird. API-Anfragen werden nie mehr Ressourcen auf einer einzigen Seite zurückgeben. + setting_apiv3_max_page_size_warning: > + Bitte ändern Sie diesen Wert nur, wenn Sie sich sicher sind, warum Sie ihn benötigen. Ein hoher Wert führt zu erheblichen Leistungseinbußen, während ein Wert, der niedriger als die Ressourcen pro Seite ist, zu Fehlern in paginierten Ansichten führt. setting_apiv3_docs: "Dokumentation" setting_apiv3_docs_enabled: "Dokumentationsseite aktivieren" setting_apiv3_docs_enabled_instructions_html: > @@ -4718,6 +4795,7 @@ de: Hinweis: Wenn aktiviert, wird dies eine Plakette mit dem Status Ihrer Installation in der %{information_panel_label} unter Administration und auf der Startseite anzeigen. Es wird nur Administratoren gezeigt.
    Die Plakette überprüft Ihre aktuelle OpenProject-Version gegen die offizielle Release Datenbank, um Sie über Updates oder bekannten Sicherheitslücken zu informieren. Für die Überprüfung der Version werden Daten benötigt, um verfügbare Updates für Ihre Umgebung zurückzugeben. Für mehr Informationen über die Plakette, welche Daten sie benötigt und wie Sie diese Überprüfung deaktivieren können, besuchen Sie bitte die Konfigurationsdokumentation. text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?" text_permanent_delete_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann" + text_permanent_remove_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann" text_plugin_assets_writable: "Verzeichnis für Plugin-Assets beschreibbar" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt. Muss mit einem Kleinbuchstaben beginnen." @@ -4808,8 +4886,8 @@ de: other: "temporär gesperrt (%{count} fehlgeschlagene Loginversuche)" confirm_status_change: "Sie sind dabei den Status von '%{name}' zu ändern. Möchten Sie wirklich fortfahren?" deleted: "Gelöschter Nutzer" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Sie können Ihren eigenen Benutzerstatus nicht ändern." + error_admin_change_on_non_admin: "Nur Administratoren können den Status von Administratorbenutzern ändern." error_status_change_failed: "Der Nutzerstatus konnte nicht geändert werden aufgrund folgender Fehler: %{errors}" invite: Nutzer via E-Mail einladen invited: eingeladen @@ -5213,3 +5291,8 @@ de: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "OpenProject verlassen" + warning_message: "Sie sind im Begriff, die OpenProject Anwendung zu verlassen und eine externe Website zu besuchen. Bitte beachten Sie, dass die externen Websites nicht unter unserer Kontrolle stehen und möglicherweise andere Datenschutz- und Sicherheitsrichtlinien haben." + continue_message: "Sind Sie sicher, dass Sie zu dem folgenden externen Link fortfahren möchten?" + continue_button: "Zur externen Webseite fortfahren" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 99e084a56dd..2d4337e06c3 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -109,6 +109,23 @@ el: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -587,6 +604,7 @@ el: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Προς το παρόν δεν υπάρχουν διαθέσιμοι τύποι. form: @@ -601,6 +619,9 @@ el: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -614,6 +635,7 @@ el: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -709,9 +731,11 @@ el: create_button: "Δημιουργία" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Αποτυχία επαναφοράς του token πρόσβασης: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -721,6 +745,9 @@ el: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Δεν υπάρχουν προς το παρόν νέα για αναφορά. @@ -1227,6 +1254,10 @@ el: onthefly: "Αυτόματη δημιουργία χρήστη" port: "Θύρα" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Ρόλοι" notification: @@ -1485,6 +1516,7 @@ el: even: "πρέπει να είναι άρτιος." exclusion: "είναι δεσμευμένο." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "είναι πολύ μεγάλο (το μέγιστο μέγεθος είναι %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1507,7 +1539,8 @@ el: not_a_datetime: "δεν είναι έγκυρη ημερομηνία και ώρα." not_a_number: "δεν είναι αριθμός." not_allowed: "δεν είναι έγκυρο επειδή λείπουν δικαιώματα." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "δεν είναι ακέραιος αριθμός." not_an_iso_date: "δεν είναι έγκυρη ημερομηνία. Απαιτούμενη μορφοποίηση: ΕΕΕΕ-ΜΜ-ΗΗ." not_same_project: "δεν ανήκει στο ίδιο έργο." @@ -1915,7 +1948,12 @@ el: token/api: one: Token πρόσβασης other: Access tokens - type: "Τύπος" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Χρήστης" version: "Έκδοση" workflow: "Ροή εργασιών" @@ -2132,6 +2170,7 @@ el: button_click_to_reveal: "Κάντε κλικ για να εμφανίσετε" button_close: "Κλείσιμο" button_collapse_all: "Σύμπτυξη όλων" + button_confirm: "Confirm" button_configure: "Ρύθμιση παραμέτρων" button_continue: "Συνέχεια" button_complete: "Complete" @@ -2164,6 +2203,7 @@ el: button_print: "Εκτύπωση" button_quote: "Παράθεση" button_remove: Αφαίρεση + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Μετονομασία" button_replace: "Αντικατάσταση" @@ -2415,7 +2455,7 @@ el: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2425,10 +2465,12 @@ el: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2469,8 +2511,8 @@ el: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2500,6 +2542,8 @@ el: custom_actions: title: "Προσαρμοσμένες ενέργειες" description: "Οι προσαρμοσμένες ενέργειες είναι συντομεύσεις με ένα κλικ προς ένα σύνολο προκαθορισμένων ενεργειών που μπορείτε να διαθέσετε σε συγκεκριμένα πακέτα εργασίας με βάση την κατάσταση, ρόλος, τύπος ή έργο." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2511,6 +2555,8 @@ el: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder χρήστες description: > @@ -2808,19 +2854,17 @@ el: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Μεταφορά της εγκατάστασης σας σε PostgreSQL" @@ -2888,14 +2932,17 @@ el: instructions_after_error: "Μπορείτε να δοκιμάσετε να συνδεθείτε ξανά κάνοντας κλικ στο %{signin}. Αν το σφάλμα παραμένει, ρωτήστε τον διαχειριστή σας για βοήθεια." menus: admin: - mail_notification: "Ειδοποιήσεις email" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Ειδοποιήσεις email" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Δεν υπάρχουν token πρόσβασης για εμφάνιση" description: "Όλα έχουν απενεργοποιηθεί. Μπορούν να επανενεργοποιηθούν από το μενού διαχείρισης." @@ -2905,34 +2952,56 @@ el: expiration: "Λήγει" indefinite_expiration: "Ποτέ" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2994,6 +3063,7 @@ el: label_always_visible: "Προβολή πάντα" label_announcement: "Ανακοίνωση" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Κλειδί πρόσβασης API" label_api_access_key_created_on: "Tο κλειδί πρόσβασης API δημιουργήθηκε πριν από %{value}" label_api_access_key_type: "API" @@ -3249,6 +3319,7 @@ el: label_journal_diff: "Σύγκριση Περιγραφών" label_language: "Γλώσσα" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Μεταβείτε σε ένα έργο..." label_keyword_plural: "Λέξεις-κλειδιά" @@ -3426,9 +3497,6 @@ el: label_project_hierarchy: "Ιεραρχία έργου" label_project_mappings: "Έργα" label_project_new: "Νέο έργο" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Έργα" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3891,7 +3959,7 @@ el: notice_not_authorized: "Δεν έχετε δικαίωμα πρόσβασης σε αυτή τη σελίδα." notice_not_authorized_archived_project: "Το έργο που προσπαθείτε να ανοίξετε έχει αρχειοθετηθεί." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Ο κωδικός πρόσβασης δεν είναι σωστός. Δεν μπορείτε να συνεχίσετε." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Βρέθηκαν %{number} αποτελέσματα. \n Πατήστε Tab για να εστιάσετε στο πρώτο αποτέλεσμα." notice_principals_found_single: "Υπάρχει ένα αποτέλεσμα. \n Πατήστε Tab για να εστιάσετε σε αυτό." notice_parent_item_not_found: "Parent item not found." @@ -4244,6 +4312,9 @@ el: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4256,11 +4327,17 @@ el: setting_apiv3_cors_origins_text_html: > Εάν είναι ενεργοποιημένο το CORS, αυτές είναι οι πηγές που επιτρέπεται να έχουν πρόσβαση στο OpenProject API.
    Παρακαλώ ελέγξτε το Τεκμηρίωση στην κεφαλίδα προέλευσης για τον τρόπο καθορισμού των αναμενόμενων τιμών. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Τεκμηρίωση" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4445,7 +4522,7 @@ el: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4551,7 +4628,7 @@ el: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4719,6 +4796,7 @@ el: Σημείωση: Εάν ενεργοποιηθεί, θα εμφανιστεί ένα σήμα με την κατάσταση της εγκατάστασής σας στον %{information_panel_label} πίνακα διαχείρισης, καθώς και στην αρχική σελίδα. Εμφανίζεται μόνο στους διαχειριστές.
    Το σήμα θα ελέγξει την τρέχουσα έκδοση του OpenProject σε σύγκριση με την επίσημη βάση δεδομένων εκδόσεων OpenProject για να σας ειδοποιήσει ενημερώσεις ή γνωστές ευπάθειες. Για περισσότερες πληροφορίες στο τι παρέχει αυτός ο έλεγχος, τι δεδομένα χρειάζονται για να παρέχονται οι διαθέσιμες ενημερώσεις και πως να απενεργοποιήσετε αυτό τον έλεγχο, παρακαλούμε επισκεφθείτε την τεκμηρίωση διαμόρφωσης. text_own_membership_delete_confirmation: "Πρόκειται να αφαιρέσετε μερικά ή όλα τα δικαιώματα και ενδέχεται να μην μπορείτε να επεξεργαστείτε πλέον το έργο μετά από αυτό.\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Εγγράψιμος κατάλογος plugin assets" text_powered_by: "Υποστηρίζεται από %{link}" text_project_identifier_info: "Επιτρέπονται μόνο πεζά γράμματα (α-ω), αριθμοί, παύλες και κάτω παύλες, πρέπει να αρχίζουν με πεζό γράμμα." @@ -5214,3 +5292,8 @@ el: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 5d2c8d7e364..8c6fc801754 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -109,6 +109,23 @@ eo: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ eo: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ eo: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ eo: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ eo: create_button: "Krei" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Eraro dum restarigo de la alirĵetono: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ eo: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Nun estas neniu novaĵo por informi. @@ -1231,6 +1258,10 @@ eo: onthefly: "Automatic user creation" port: "Pordo" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roloj" notification: @@ -1489,6 +1520,7 @@ eo: even: "must be even." exclusion: "rezervita." feature_disabled: ne estas disponebla. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ eo: not_a_datetime: "Ĝi ne estas valida dato/horo." not_a_number: "Ĝi ne estas numero." not_allowed: "nevalida pro manko de permesoj." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ĝi ne estas entjero." not_an_iso_date: "Ĝi ne estas valida dato. Deviga datumo estas: JJJJ-MM-TT." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ eo: token/api: one: Atingoĵetono other: Access tokens - type: "Tipo" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Uzanto" version: "Versio" workflow: "Laborfluo" @@ -2136,6 +2174,7 @@ eo: button_click_to_reveal: "Klaki por malkaŝi" button_close: "Fermi" button_collapse_all: "Maletendi ĉion" + button_confirm: "Confirm" button_configure: "Agordi" button_continue: "Daŭrigi" button_complete: "Complete" @@ -2168,6 +2207,7 @@ eo: button_print: "Printi" button_quote: "Citi" button_remove: Forigi + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Alinomi" button_replace: "Anstataŭigi" @@ -2419,7 +2459,7 @@ eo: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ eo: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ eo: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ eo: custom_actions: title: "Adaptitaj agoj" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ eo: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ eo: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Transmetanta vian instalon al PostgreSQL" @@ -2892,14 +2936,17 @@ eo: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Retpoŝtaj sciigoj" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Retpoŝtaj sciigoj" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ eo: expiration: "Senvalidiĝas" indefinite_expiration: "Neniam" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ eo: label_always_visible: "Ĉiam montrita" label_announcement: "Anonco" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API atingokodo" label_api_access_key_created_on: "API atingokodo kreita antaŭ la %{value}" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ eo: label_journal_diff: "Komparo de la priskribo" label_language: "Lingvo" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Iri al la projekto..." label_keyword_plural: "Ŝlosilvortoj" @@ -3430,9 +3501,6 @@ eo: label_project_hierarchy: "Projekta hierarkio" label_project_mappings: "Projektoj" label_project_new: "Nova projekto" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projektoj" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ eo: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ eo: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ eo: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentado" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ eo: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ eo: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ eo: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ eo: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 2d3796afc82..5460c591e81 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -109,6 +109,23 @@ es: explanation: text: "Las acciones individuales de un usuario (como actualizar dos veces un paquete de trabajo) se combinan en una sola acción si la diferencia de antigüedad es inferior al intervalo de tiempo especificado. Se mostrarán como una sola acción en la aplicación. También se retrasarán las notificaciones por la misma cantidad de tiempo, lo que reducirá el número de correos electrónicos enviados y causará también que se retrase el %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "El protocolo de contexto de modelo (MCP, por sus siglas en inglés) permite a los agentes de IA proporcionar a sus usuarios herramientas y recursos expuestos por esta instancia de OpenProject." + resources_heading: "Recursos" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Actualizar recursos" + tools_heading: "Herramientas" + tools_description: "OpenProject implementa las siguientes herramientas. Cada una de ellas puede habilitarse, renombrarse y describirse como usted desee. Para más información, consulte la [documentación sobre herramientas del MCP](docs_url)." + tools_submit: "Actualizar herramientas" + multi_update: + success: "Las configuraciones del MCP se actualizaron correctamente." + server_form: + description_caption: "Cómo se describirá el servidor del MCP a otras aplicaciones que se conecten a él." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "No se ha podido actualizar la configuración del MCP." + success: "La configuración del MCP se ha actualizado correctamente." scim_clients: authentication_methods: sso: "JWT del proveedor de identidad" @@ -589,6 +606,7 @@ es: is_for_all_blank_slate: heading: Para todos los proyectos description: Este atributo de proyecto está activado en todos los proyectos, ya que la opción «Para todos los proyectos» está marcada. No puede desactivarse para proyectos individuales. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Actualmente no hay tipos disponibles. form: @@ -603,6 +621,9 @@ es: work_package_priorities: new_label: "Nueva prioridad" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "El artefacto generado se guardará como PDF adjunto al paquete de trabajo del artefacto." description_file_link_export: "El paquete de trabajo de artefactos tendrá un enlace de archivo a un PDF almacenado en un almacenamiento de archivos externo. Requiere un almacenamiento de archivos de trabajo con carpetas de proyecto gestionadas automáticamente para este proyecto. Por el momento sólo son compatibles los almacenamientos de archivos Nextcloud." @@ -616,6 +637,7 @@ es: label_request_submission: "Envío de la solicitud" project_attributes_description: > Selecciona los atributos del proyecto que deben incluirse en la solicitud de inicio del proyecto. Esta lista solo incluye los [atributos del proyecto](project_attributes_url) habilitados para este proyecto. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Editar estado wizard: @@ -711,9 +733,11 @@ es: create_button: "Crear" name_label: "Nombre del token" created_dialog: + one_time_warning: "Esta es la única vez que verá este token. Asegúrese de copiarlo ahora." token/api: title: "Se ha generado el token de API" - warning: "Esta es la única vez que verá este token. Asegúrese de copiarlo ahora." + token/rss: + title: "Se ha generado el token de RSS" failed_to_reset_token: "No se pudo restablecer el token de acceso: %{error}" failed_to_create_token: "Error al crear el token de acceso: %{error}" failed_to_revoke_token: "Fallo al revocar el token de acceso: %{error}" @@ -723,6 +747,9 @@ es: notice_api_token_revoked: "Se ha eliminado el token de la API. Para crear un nuevo token, utilice el botón de la sección API." notice_rss_token_revoked: "Se ha eliminado el token RSS. Para crear un nuevo token, utilice el enlace de la sección RSS." notice_ical_token_revoked: 'Se ha revocado el token de iCalendar «%{token_name}» para el calendario «%{calendar_name}» del proyecto «%{project_name}». La URL de iCalendar con este token ya no es válida.' + password_confirmation_dialog: + confirmation_required: "Necesitas introducir la contraseña de tu cuenta para confirmar este cambio." + title: "Confirma tu contraseña para continuar" news: index: no_results_title_text: No hay noticias sobre las que informar por el momento. @@ -1228,6 +1255,10 @@ es: onthefly: "Creación automática de usuarios" port: "Puerto" tls_certificate_string: "Certificado SSL del servidor LDAP" + mcp_configuration: + enabled: Habilitado + title: Título + description: Descripción member: roles: "Perfiles" notification: @@ -1486,6 +1517,7 @@ es: even: "debe ser incluido." exclusion: "está reservado." feature_disabled: no está disponible. + feature_disabled_for_project: está desactivado para este proyecto. file_too_large: "es demasiado grande (el tamaño máximo es de %{count} Bytes)." filter_does_not_exist: "el filtro no existe." format: "no coincide con el formato esperado '%{expected}'." @@ -1508,7 +1540,8 @@ es: not_a_datetime: "no es una fecha/hora válida." not_a_number: "No es un número." not_allowed: "no es válido porque faltan permisos." - not_json: "no es un objeto JSON válido." + not_json: "no se puede analizar como JSON." + not_json_object: "no es un objeto JSON." not_an_integer: "No es un entero." not_an_iso_date: "no es una fecha válida. Requiere formato: AAAA-MM-DD." not_same_project: "no pertenecen a un mismo proyecto." @@ -1916,7 +1949,12 @@ es: token/api: one: Token de acceso other: Tokens de acceso - type: "Tipo" + token/rss: + one: "Token RSS" + other: "Tokens RSS" + type: + one: "Tipo" + other: "Tipos" user: "Usuario" version: "Versión" workflow: "Flujo de trabajo" @@ -2133,6 +2171,7 @@ es: button_click_to_reveal: "Haz Click para ver" button_close: "Cerrar" button_collapse_all: "Colapsar todo" + button_confirm: "Confirmar" button_configure: "Configurar" button_continue: "Continuar" button_complete: "Completar" @@ -2165,6 +2204,7 @@ es: button_print: "Imprimir" button_quote: "Comentario" button_remove: Eliminar + button_remove_permanently: "Eliminar permanentemente" button_remove_reminder: "Eliminar recordatorio" button_rename: "Cambiar el nombre" button_replace: "Sustituir" @@ -2416,7 +2456,7 @@ es: baseline_comparison: Comparación de base de referencia board_view: Tableros avanzados calculated_values: Valores calculados - conditional_highlighting: Resaltado condicional + capture_external_links: Detección de enlaces externos internal_comments: Comentarios Internos custom_actions: Acciones personalizadas custom_field_hierarchies: Jerarquías @@ -2426,10 +2466,12 @@ es: edit_attribute_groups: Editar grupos de atributos gantt_pdf_export: Exportación de Gantt a PDF ldap_groups: Usuarios de LDAP y sincronización de grupos + mcp_server: Servidor MCP nextcloud_sso: Inicio de sesión único para almacenamiento en la nube one_drive_sharepoint_file_storage: Almacenamiento de archivos OneDrive/SharePoint placeholder_users: Usuarios de marcadores de posición portfolio_management: Gestión de carteras + project_creation_wizard: Solicitud de inicio de proyecto project_list_sharing: Compartición de la lista de proyectos readonly_work_packages: Paquetes de trabajo de solo lectura scim_api: API del servidor SCIM @@ -2470,8 +2512,8 @@ es: description: "Cree asuntos generados automáticamente utilizando atributos y texto referenciados." customize_life_cycle: description: "Cree y organice fases de proyecto diferentes a las previstas en la planificación del ciclo del proyecto PM2." - conditional_highlighting: - description: "¿Necesita que determinados paquetes de trabajo destaquen entre la masa? Utilice el resaltado condicional en la tabla de paquetes de trabajo." + capture_external_links: + description: "Prevenga los ataques de ingeniería social detectando y advirtiendo sobre los enlaces externos antes de que los usuarios los visiten." work_package_query_relation_columns: description: "¿Necesita ver relaciones o elementos secundarios en la lista de paquetes de trabajo?" edit_attribute_groups: @@ -2501,6 +2543,8 @@ es: custom_actions: title: "Acciones personalizadas" description: "Las acciones personalizadas son accesos directos con un solo clic a un conjunto de acciones predefinidas que puede mostrar en determinados paquetes de trabajo según el estado, rol, tipo o proyecto." + mcp_server: + description: "Integre agentes de IA con su instancia de OpenProject a través del protocolo de contexto de modelo (MCP)." nextcloud_sso: title: "Inicio de sesión único para almacenamiento en la nube" description: "Habilite una autenticación fluida y segura para su almacenamiento Nextcloud con el inicio de sesión único. Simplifique la gestión del acceso y mejore la comodidad de los usuarios." @@ -2512,6 +2556,8 @@ es: description: "Permite a los usuarios iniciar sesión a través de proveedores externos de SSO usando SAML u OpenID Connect para un acceso fluido y una integración perfecta con los sistemas de identidad existentes." virus_scanning: description: "Asegúrese de que los archivos cargados en OpenProject se analizan en busca de virus antes de que otros usuarios puedan acceder a ellos." + project_creation_wizard: + description: "Genere un asistente paso a paso para ayudar a los gestores de proyectos a completar una solicitud de inicio de proyecto." placeholder_users: title: Usuarios de marcador de posición description: > @@ -2809,19 +2855,17 @@ es: learn_about: "Más información sobre todas las nuevas funciones" missing: "Aún no hay funciones destacadas." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > El lanzamiento incluye varias funciones nuevas y mejoras, tales como: new_features_list: - line_0: Colaboración de documentos en tiempo real. - line_1: Capacidad para estructurar proyectos relacionados en programas y carteras con el fin de centrarte en objetivos estratégicos (extensión Enterprise). - line_2: Mejor gestión de reuniones con modo Borrador, modo Presentación, resultados mejorados y suscripción a iCal. - line_3: Integración actualizada de SharePoint con permisos más restrictivos (extensión Enterprise). - line_4: Vista general del proyecto rediseñada con nuevas pestañas, widgets configurables y un diseño mejorado. - line_5: Opción para proteger más estrictamente la privacidad de los usuarios que no trabajan en el mismo proyecto. - line_6: Flujo de creación de proyectos mejorado con una mejor selección de plantillas. - line_7: Búsqueda global más inteligente, incluyendo el tipo y estado, mejorando la precisión en varios autocompletadores. - line_8: Mejoras de accesibilidad con textos ALT y colores de gráficos mejorados. + line_0: Inicio automatizado de proyectos (extensión Enterprise). + line_1: "Reuniones: añada paquetes de trabajo nuevos o existentes como resultados." + line_2: "Reuniones: muestre las respuestas de iCal en OpenProject." + line_3: "Reuniones periódicas: duplique los puntos del orden del día para el siguiente evento." + line_4: "Lanzamiento para la versión Community: resaltado de atributos." + line_5: Advertencia antes de abrir enlaces externos en el contenido que ha proporcionado un usuario (extensión Enterprise). + line_6: Mejora del rendimiento y de la experiencia de usuario, incluida la pestaña Actividad y el módulo Documentos. links: upgrade_enterprise_edition: "Actualizar a Enterprise" postgres_migration: "Migrando su instalación a PostgreSQL" @@ -2889,14 +2933,17 @@ es: instructions_after_error: "Puedes intentar entrar nuevamente haciendo clic sobre %{signin}. Si el error persiste, contacta a tu administrador para que te ayude." menus: admin: - mail_notification: "Notificaciones de correo electrónico" - mails_and_notifications: "Correos electrónicos y notificaciones" + ai: "Inteligencia artificial (IA)" aggregation: "Agregación" api_and_webhooks: "API y webhooks" + mail_notification: "Notificaciones de correo electrónico" + mails_and_notifications: "Correos electrónicos y notificaciones" + mcp_configurations: "Protocolo de contexto de modelo (MCP)" quick_add: label: "Añadir…" my_account: access_tokens: + description: "Los tokens de proveedor son emitidos por OpenProject y permiten a otras aplicaciones acceder a él. Los tokens de cliente son emitidos por otras aplicaciones y permiten a OpenProject acceder a ellos." no_results: title: "Ningún token de acceso que mostrar" description: "Todos ellos han sido desabilitados. Pueden ser rehabilitados en el menú de administración." @@ -2906,34 +2953,56 @@ es: expiration: "Expira" indefinite_expiration: "Nunca" simple_revoke_confirmation: "¿Seguro que desea revocar este token?" + tabs: + client: + title: "Tokens de cliente" + provider: + title: "Tokens de proveedor" token/api: + blank_description: "Aún no hay tokens API. Puede crear uno utilizando el botón de abajo." + blank_title: "No hay tokens API" title: "API" + table_title: "Tokens API" text_hint: "Los tokens API permiten a las aplicaciones de terceros comunicarse con esta instancia de OpenProject a través de las API REST." + static_token_name: "Token API" disabled_text: "Los tokens API no están habilitados por el administrador. Póngase en contacto con su administrador para utilizar esta función." add_button: "Token API" - api: - static_token_name: "Token API" ical: + blank_description: "Para añadir un token de iCalendar, suscríbase a un calendario nuevo o existente desde el módulo Calendario de un proyecto. Debe disponer de los permisos necesarios." + blank_title: "No hay token de iCalendar" title: "iCalendar" + table_title: "Tokens de iCalendar" text_hint_link: "Los tokens iCalendar permiten a los usuarios [suscribirse a calendarios de OpenProject](docs_url) y ver la información actualizada de los paquetes de trabajo des de clientes externos." disabled_text: "Las suscripciones a iCalendar no están habilitadas por el administrador. Póngase en contacto con su administrador para utilizar esta función." - empty_text_hint: "Para añadir un token de iCalendar, suscríbase a un calendario nuevo o existente desde el módulo Calendario de un proyecto. Debe disponer de los permisos necesarios." - oauth: + oauth_application: + active_tokens: "Tokens activos" + blank_description: "No hay ningún acceso a aplicaciones de terceros configurado y activo para usted." + blank_title: "No hay token de aplicación OAuth" + last_used_at: "Utilizado por última vez el" title: "OAuth" - text_hint: "Los tokens OAuth permiten a las aplicaciones de terceros conectarse con esta instancia de OpenProject." - empty_text_hint: "No hay ningún acceso a aplicaciones de terceros configurado y activo para usted. Póngase en contacto con su administrador para activar esta función." - rss: + table_title: "Tokens de aplicación OAuth" + text_hint: "Los tokens de aplicación OAuth permiten a las aplicaciones de terceros conectarse con esta instancia de OpenProject." + oauth_client: + blank_description: "Aún no hay tokens de cliente de OAuth." + blank_title: "No hay tokens de cliente de OAuth" + failed: "Se ha producido un error y no se ha podido eliminar el token. Inténtelo de nuevo más tarde." + integration_type: "Tipo de integración" + table_title: "Tokens de cliente de OAuth" + text_hint: "Los tokens de cliente de OAuth permiten a esta instancia de OpenProject conectarse con aplicaciones externas, como almacenamientos de archivos." + title: "OAuth" + remove_token: "¿Seguro que desea eliminar este token? Tendrá que volver a iniciar sesión en %{integration}." + removed: "Token de cliente de OAuth eliminado con éxito" + unknown_integration: "Desconocido" + token/rss: + add_button: "Token RSS" + blank_description: "Aún no hay tokens RSS. Puede crear uno utilizando el botón de abajo." + blank_title: "No hay tokens RSS" title: "RSS" - text_hint: "Los tokens RSS permiten a los usuarios mantenerse al día de los últimos cambios en esta instancia de OpenProject a través de un lector RSS externo." + table_title: "Tokens RSS" + text_hint: "Los tokens RSS permiten a los usuarios mantenerse al día con los últimos cambios en esta instancia de OpenProject mediante un lector RSS externo." static_token_name: "Token RSS" disabled_text: "Los tokens RSS no están habilitados por el administrador. Póngase en contacto con su administrador para utilizar esta función." storages: - title: "Almacenamientos de archivos" - text_hint: "Los tokens de Almacenamiento de archivos conectan esta instancia de OpenProject con un Almacenamiento de archivos externo." - empty_text_hint: "No hay acceso de almacenamiento vinculado a su cuenta." - revoke_token: "¿Realmente desea eliminar este token? Tendrá que volver a iniciar sesión en %{storage}" - removed: "Ficha de almacenamiento de archivos eliminada con éxito" - failed: "Se ha producido un error y no se ha podido eliminar el token. Inténtelo de nuevo más tarde." unknown_storage: "Almacenamiento desconocido" notifications: reasons: @@ -2995,6 +3064,7 @@ es: label_always_visible: "Siempre se muestra" label_announcement: "Aviso" label_angular: "AngularJS" + label_app_modules: "Módulos %{app_title}" label_api_access_key: "Código de acceso API" label_api_access_key_created_on: "Código de acceso API creado hace %{value}" label_api_access_key_type: "API" @@ -3250,6 +3320,7 @@ es: label_journal_diff: "Comparación de la descripción" label_language: "Idioma" label_languages: "Idiomas" + label_external_links: "Enlaces externos" label_locale: "Idioma y región" label_jump_to_a_project: "Saltar a un proyecto..." label_keyword_plural: "Palabras clave" @@ -3427,9 +3498,6 @@ es: label_project_hierarchy: "Jerarquía del proyecto" label_project_mappings: "Proyectos" label_project_new: "Nuevo proyecto" - label_project_initiation_request: "Solicitud de inicio de un nuevo proyecto" - label_project_creation_wizard: "Asistente para la creación de un nuevo proyecto" - label_project_mandate: "Mandato de un nuevo proyecto" label_project_plural: "Proyectos" label_project_list_plural: "Listas de proyectos" label_project_life_cycle: "Ciclo de vida del proyecto" @@ -3893,7 +3961,7 @@ es: notice_not_authorized: "No está autorizado a acceder a esta página." notice_not_authorized_archived_project: "El proyecto que usted esta tratando de acceder ha sido archivado." notice_requires_enterprise_token: "Falta el token de la empresa o no permite el acceso a esta página." - notice_password_confirmation_failed: "La contraseña es incorrecta. No se puede continuar." + notice_password_confirmation_failed: "La contraseña introducida no es correcta." notice_principals_found_multiple: "Hemos encontrado %{number} resultados. \n Pulse TAB para ver el primer resultado." notice_principals_found_single: "Se ha encontrado solo un resultado. \n Pulse TAB para verlo." notice_parent_item_not_found: "Elemento padre no encontrado." @@ -4245,6 +4313,9 @@ es: setting_allowed_link_protocols: "Protocolos de enlace permitidos" setting_allowed_link_protocols_text_html: >- Permita que estos protocolos se muestren como enlaces en las descripciones de los paquetes de trabajo, los campos de texto largos y los comentarios. Por ejemplo, %{tel_code} o %{element_code}. Introduzca un protocolo por línea.
    Los protocolos %{http_code}, %{https_code} y %{mailto_code} siempre están permitidos. + setting_capture_external_links: "Detección de enlaces externos" + setting_capture_external_links_text: > + Cuando esta función está habilitada, todos los enlaces externos en texto formateado redirigirán a una página de advertencia antes de salir de la aplicación. Esto ayuda a proteger a los usuarios de sitios web externos potencialmente maliciosos. setting_after_first_login_redirect_url: "Primera redirección de inicio de sesión" setting_after_first_login_redirect_url_text_html: > Establezca una ruta para redirigir a los usuarios tras su primer inicio de sesión. Si está vacía, redirige a la página de inicio del recorrido de incorporación.
    Ejemplo: /my/page @@ -4257,11 +4328,17 @@ es: setting_apiv3_cors_origins_text_html: > Si CORS está habilitado, estos son los orígenes que tienen permiso para acceder a la API de OpenProject.
    Consulte la documentación sobre el encabezado Origin para obtener información sobre cómo especificar los valores esperados. setting_apiv3_write_readonly_attributes: "Acceso de escritura a atributos de solo lectura" - setting_apiv3_write_readonly_attributes_instructions_html: > - Si se activa, la API permitirá a los administradores escribir atributos estáticos de solo lectura durante la creación, como createdAt y author.
    Atención: Este ajuste tiene un caso de uso para, por ejemplo, la importación de datos, pero permite a los administradores suplantar la creación de elementos como otros usuarios. Sin embargo, todas las solicitudes de creación se registran con el verdadero autor.
    Para obtener más información sobre los atributos y los recursos admitidos, consulte el enlace %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Si se activa, la API permitirá a los administradores escribir atributos estáticos de solo lectura durante la creación, como createdAt y author. + setting_apiv3_write_readonly_attributes_warning: > + Este ajuste tiene un caso de uso para, por ejemplo, la importación de datos, pero permite a los administradores suplantar la creación de elementos como otros usuarios. Sin embargo, todas las solicitudes de creación se registran con el verdadero autor. + setting_apiv3_write_readonly_attributes_additional: > + Para obtener más información sobre los atributos y los recursos admitidos, consulte el enlace %{api_documentation_link}. setting_apiv3_max_page_size: "Tamaño máximo de página API" - setting_apiv3_max_page_instructions_html: > - Establecer el tamaño máximo de página con el que responderá la API. No será posible realizar peticiones API que devuelvan más valores en una sola página.
    Advertencia: Por favor, cambie este valor sólo si está seguro de por qué lo necesita. Un ajuste alto impactará significativamente el rendimiento, mientras que un valor inferior a las opciones por página causará errores en las vistas paginadas. + setting_apiv3_max_page_size_instructions: > + Establezca el tamaño máximo de página con el que responderá la API. No se podrán realizar solicitudes a la API que devuelvan más valores en una sola página. + setting_apiv3_max_page_size_warning: > + Por favor, cambie este valor solo si sabe con certeza por qué lo necesita. Un ajuste alto impactará significativamente el rendimiento, mientras que un valor inferior a las opciones por página causará errores en las vistas paginadas. setting_apiv3_docs: "Documentación" setting_apiv3_docs_enabled: "Activar página de documentos" setting_apiv3_docs_enabled_instructions_html: > @@ -4440,13 +4517,13 @@ es: not_writable: "La configuración no es modificable y solo puede cambiarla un administrador del sistema." failed_to_update: "No se pudo actualizar la configuración de «%{name}»: %{message}" authentication: - login: "Ingresar" + login: "Iniciar sesión" registration: "Registro" sso: "Inicio de sesión único (SSO)" omniauth_direct_login_hint_html: > Si esta opción está activa, las solicitudes de inicio de sesión se redirigirán al proveedor omniauth configurado. El menú desplegable de inicio de sesión y la página de inicio de sesión se desactivarán.
    Nota: A menos que también deshabilite los inicios de sesión con contraseña, con esta opción activada, los usuarios podrán seguir iniciando sesión internamente visitando la página de inicio de sesión %{internal_path}. remapping_existing_users_hint: > - Si está habilitado, permite a cualquier proveedor de identidad configurado iniciar sesión a los usuarios existentes basándose en su dirección de correo electrónico, incluso si el usuario nunca ha iniciado sesión a través de ese proveedor anteriormente. Esto puede ser útil al migrar la instancia de OpenProject a un nuevo proveedor de SSO, pero no se recomienda cuando se usa un proveedor que no es confiable para todos los usuarios de su instancia. + Si está habilitado, permite a cualquier proveedor de identidad configurado iniciar sesión a los usuarios existentes basándose en su nombre de usuario, incluso si el usuario nunca ha iniciado sesión a través de ese proveedor anteriormente. Esto puede ser útil al migrar la instancia de OpenProject a un nuevo proveedor de SSO, pero no se recomienda cuando se usa un proveedor que no es confiable para todos los usuarios de su instancia. attachments: whitelist_text_html: > Define una lista de extensiones de archivo válidas o tipos MIME para los archivos cargados.
    Escriba las extensiones de archivo (por ejemplo, %{ext_example}) o tipos MIME (%{mime_example}).
    Deje vacío este campo para que pueda cargarse cualquier tipo de archivo. Se permiten varios valores (una línea para cada valor). @@ -4552,7 +4629,7 @@ es: project_mandate: "Mandato del proyecto" submission: description_template: > - **Este paquete de trabajo se ha creado automáticamente al completar el flujo de trabajo %{wizard_name}.** Se ha generado un archivo PDF con toda la información enviada y se ha adjuntado a este paquete de trabajo para fines de referencia y auditoría. Si necesitas actualizar o volver a ejecutar los pasos de inicio, puedes volver a abrir el asistente en cualquier momento utilizando el siguiente enlace: + **Este paquete de trabajo se ha creado automáticamente al completar el flujo de trabajo %{wizard_name}.** Se ha generado un artefacto en formato PDF con toda la información enviada y se ha adjuntado a este paquete de trabajo para fines de referencia y auditoría. Si necesitas actualizar o volver a ejecutar los pasos de inicio, puedes volver a abrir el asistente en cualquier momento utilizando el siguiente enlace: description: "Cuando un usuario envía una solicitud de inicio de proyecto, se creará un nuevo paquete de trabajo con el artefacto de solicitud adjunto como archivo PDF. La configuración siguiente define el tipo, el estado y el asignado de este nuevo paquete de trabajo." work_package_type: "Tipo de paquete de trabajo" work_package_type_caption: "El tipo de paquete de trabajo que debe utilizarse para almacenar el artefacto completado." @@ -4720,6 +4797,7 @@ es: Nota: al activarse, se mostrará una insignia con el estado de instalación en el %{information_panel_label} panel de administración, y en la página principal. Solamente será visible para administradores.
    La insignia comprobará tu versión actual de OpenProject comparada con la base de datos oficial de OpenProject para alertarte de cualquier actualización o vulnerabilidad. Para más información sobre las funciones de la comprobación, los datos necesarios para conseguir actualizaciones disponibles, o para desactivar esta comprobación, por favor visita la documentación de configuración. text_own_membership_delete_confirmation: "Estás a punto de eliminar algunos o todos tus permisos, y podrías no poder volver a editar este proyecto.\n¿Estás seguro/a de que quieres continuar?" text_permanent_delete_confirmation_checkbox_label: "Entiendo que esta eliminación no se puede revertir" + text_permanent_remove_confirmation_checkbox_label: "Entiendo que esta eliminación no se puede revertir" text_plugin_assets_writable: "Directorio de extensiones activos escribible" text_powered_by: "Con tecnología de %{link}" text_project_identifier_info: "Se permiten sólo letras minúsculas (a-z), números, guiones y guiones bajos, debe comenzar con una letra minúscula." @@ -4810,8 +4888,8 @@ es: other: "bloqueada temporalmente (%{count} intentos fallidos de inicio de sesión)" confirm_status_change: "Va a cambiar el estado de “%{name}”. ¿Está seguro de que quiere continuar?" deleted: "Usuarios Eliminados" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "No puede cambiar su propio estado de usuario." + error_admin_change_on_non_admin: "Solo los administradores pueden cambiar el estado de los usuarios administradores." error_status_change_failed: "Cambiar la condición de usuario falló debido a los errores siguientes: %{errors}" invite: Invitar a un usuario por email invited: invitado @@ -5215,3 +5293,8 @@ es: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Salir de OpenProject" + warning_message: "Está a punto de salir de OpenProject y visitar un sitio web externo. Tenga en cuenta que los sitios web externos no están bajo nuestro control y pueden tener políticas de privacidad y seguridad diferentes." + continue_message: "¿Seguro que desea visitar el siguiente enlace externo?" + continue_button: "Continuar al sitio web externo" diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index 4e1e919bc84..4d8bb73e86b 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -109,6 +109,23 @@ et: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ et: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ et: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ et: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ et: create_button: "Loo uus" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ et: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ et: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rollid" notification: @@ -1489,6 +1520,7 @@ et: even: "peab olema paarisarv." exclusion: "on reserveeritud." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ et: not_a_datetime: "is not a valid date time." not_a_number: "pole arv." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "pole täisarv." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ et: token/api: one: Access token other: Access tokens - type: "Tüüp" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Kasutaja" version: "Versioon" workflow: "Töövoog" @@ -2136,6 +2174,7 @@ et: button_click_to_reveal: "Näitamiseks kliki" button_close: "Sulge" button_collapse_all: "Koonda kõik" + button_confirm: "Confirm" button_configure: "Seadista" button_continue: "Jätka" button_complete: "Complete" @@ -2168,6 +2207,7 @@ et: button_print: "Prindi" button_quote: "Tsiteeri" button_remove: Eemalda + button_remove_permanently: "Remove permanently" button_remove_reminder: "Eemalda meeldetuletus" button_rename: "Nimeta ümber" button_replace: "Asenda" @@ -2419,7 +2459,7 @@ et: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ et: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ et: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ et: custom_actions: title: "Kohandatud toimingud" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ et: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ et: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ et: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Eposti märguandmed" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Eposti märguandmed" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ et: expiration: "Aegub" indefinite_expiration: "Mitte kunagi" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ et: label_always_visible: "Näidatakse alati" label_announcement: "Teadaanne" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API ligipääsutunnus" label_api_access_key_created_on: "API ligipääsutunnus on loodud %{value} tagasi" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ et: label_journal_diff: "Kirjelduse võrdlus" label_language: "Keel" label_languages: "Keeled" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Mine projekti..." label_keyword_plural: "Märksõnad" @@ -3430,9 +3501,6 @@ et: label_project_hierarchy: "Projekti hierarhia" label_project_mappings: "Projektid" label_project_new: "Uus projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projektid" label_project_list_plural: "Project lists" label_project_life_cycle: "Projekti elutsükkel" @@ -3896,7 +3964,7 @@ et: notice_not_authorized: "Sul ei ole sellele lehele ligipääsuks õigusi." notice_not_authorized_archived_project: "See projekt on arhiveeritud." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ et: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ et: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ et: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ et: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ et: 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: "Sa võtad endalt ära osa või kõik õigused ega saa edaspidi seda projekti võib-olla enam muuta.\nOled sa jätkamises kindel?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Lisamoodulite abifailide kataloog on kirjutatav" text_powered_by: "Jooksutab %{link}" text_project_identifier_info: "Lubatud on ainult väikesed tähed (a-z), numbrid ja kriipsud. Peab algama väikse tähega." @@ -5220,3 +5298,8 @@ et: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 9c336c65abb..713fb7f24c4 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -109,6 +109,23 @@ eu: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ eu: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ eu: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ eu: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ eu: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ eu: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ eu: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ eu: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ eu: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ eu: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Bertsioa" workflow: "Workflow" @@ -2136,6 +2174,7 @@ eu: button_click_to_reveal: "Click to reveal" button_close: "Itxi" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ eu: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ eu: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ eu: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ eu: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ eu: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ eu: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ eu: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ eu: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ eu: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ eu: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ eu: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ eu: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ eu: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ eu: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ eu: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentazioa" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ eu: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ eu: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ eu: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ eu: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index b986935dacf..e9effa20d1b 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -109,6 +109,23 @@ fa: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ fa: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ fa: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ fa: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ fa: create_button: "ایجاد" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "عدم موفقیت در تنظیم مجدد رمز دسترسی: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ fa: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ fa: onthefly: "Automatic user creation" port: "پورت" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "نقش‌ها" notification: @@ -1489,6 +1520,7 @@ fa: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ fa: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ fa: token/api: one: Access token other: Access tokens - type: "نوع" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "کاربر" version: "نسخه" workflow: "Workflow" @@ -2136,6 +2174,7 @@ fa: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "بستن همه" + button_confirm: "Confirm" button_configure: "ویرایش" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ fa: button_print: "چاپ کردن" button_quote: "نقل قول" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "تغییر نام" button_replace: "Replace" @@ -2419,7 +2459,7 @@ fa: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ fa: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ fa: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ fa: custom_actions: title: "اقدامات سفارشی" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ fa: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ fa: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ fa: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "اعلان های ایمیل" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "اعلان های ایمیل" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ fa: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ fa: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ fa: label_journal_diff: "Description Comparison" label_language: "زبان" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ fa: label_project_hierarchy: "Project hierarchy" label_project_mappings: "پروژه‌ها" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "پروژه‌ها" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ fa: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "رمز عبور شما درست نیست. لذا ادامه ممکن نیست." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ fa: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ fa: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ fa: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ fa: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ fa: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ fa: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index d1d450f73af..efcfadb42f8 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -109,6 +109,23 @@ fi: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ fi: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Tällä hetkellä tyyppejä ei ole saatavilla. form: @@ -605,6 +623,9 @@ fi: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ fi: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ fi: create_button: "Uusi" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "API-salasanan resetointi epäonnistui: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ fi: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Tällä hetkellä ei ole uutisia. @@ -1231,6 +1258,10 @@ fi: onthefly: "Automatic user creation" port: "Portti" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roolit" notification: @@ -1489,6 +1520,7 @@ fi: even: "täytyy olla parillinen." exclusion: "on jo varattu." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "on liian suuri (suurin sallittu koko on %{count} tavua)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ fi: not_a_datetime: "ei ole kelvollinen aika." not_a_number: "ei ole numero." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ei ole kokonaisluku." not_an_iso_date: "ei ole kelvollinen päivämäärä. Vaadittava muoto: VVVV-KK-PP." not_same_project: "ei kuulu samaan projektiin." @@ -1919,7 +1952,12 @@ fi: token/api: one: API-salasana other: Access tokens - type: "Tyyppi" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Käyttäjä" version: "Versio" workflow: "Työnkulku" @@ -2136,6 +2174,7 @@ fi: button_click_to_reveal: "Click to reveal" button_close: "Sulje" button_collapse_all: "Tiivistä kaikki" + button_confirm: "Confirm" button_configure: "Asetukset" button_continue: "Jatka" button_complete: "Complete" @@ -2168,6 +2207,7 @@ fi: button_print: "Tulosta" button_quote: "Siteeraa" button_remove: Poista + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Nimeä uudelleen" button_replace: "Korvaa" @@ -2419,7 +2459,7 @@ fi: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ fi: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ fi: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ fi: custom_actions: title: "Mukautetut toiminnot" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ fi: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ fi: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ fi: instructions_after_error: "Voit kirjautua uudelleen napsauttamalla %{signin}. Jos virhe toistuu, pyydä apua järjestelmävalvojalta." menus: admin: - mail_notification: "Sähköposti-ilmoitukset" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Sähköposti-ilmoitukset" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Ei API-salasanoja" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ fi: expiration: "Vanhentuu" indefinite_expiration: "Ei koskaan" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ fi: label_always_visible: "Aina näkyvissä" label_announcement: "Ilmoitus" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API avain" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ fi: label_journal_diff: "Kuvauksen vertailu" label_language: "Kieli" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Siirry projektiin..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ fi: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projektit" label_project_new: "Uusi projekti" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projektit" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ fi: notice_not_authorized: "Sinulla ole oikeuksia käyttää tätä sivua." notice_not_authorized_archived_project: "Haluamasi projekti on arkistoitu." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Salasana ei ole oikea. Ei voi jatkua." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ fi: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ fi: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Käyttöohjeet" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ fi: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ fi: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ fi: 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: "Olet aikeissa poistaa yhden tai useamman käyttöoikeuden ja et ehkä voi enää muokata tätä projektia sen jälkeen. Haluatko varmasti jatkaa?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin varat hakemisto kirjoitettavissa" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Vain pienet kirjaimet (a-z), numerot, väliviivat ja alaviivat ovat sallittuja. Ensimmäisenä tulee olla pieni kirjain." @@ -5220,3 +5298,8 @@ fi: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index fb74f8ed7ce..ae265d040d8 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -109,6 +109,23 @@ fil: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ fil: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Sa kasalukuyan ay walang mga uri na available. form: @@ -605,6 +623,9 @@ fil: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ fil: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ fil: create_button: "Lumikha" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Nabigong i-reset ang access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ fil: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Sa kasalukuyan ay walang mga balita para ma-ireport. @@ -1231,6 +1258,10 @@ fil: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Ang mga tungkulin" notification: @@ -1489,6 +1520,7 @@ fil: even: "dapat ay kapareho." exclusion: "ay nakareserba." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "ay masyadong malaki (pinakamataas na laki ay %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ fil: not_a_datetime: "ay hindi balido ang petsa ng oras." not_a_number: "ay hindi numero." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ay hindi integer." not_an_iso_date: "ay hindi balido ang petsa. Ang kinakailangan format: YYYY-MM-DD." not_same_project: "ay hindi nabibilang sa parehong proyekto." @@ -1919,7 +1952,12 @@ fil: token/api: one: I-access ang token other: Access tokens - type: "Uri" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Gumagamit" version: "Bersyon" workflow: "Daloy ng trabaho" @@ -2136,6 +2174,7 @@ fil: button_click_to_reveal: "Click to reveal" button_close: "Isara" button_collapse_all: "Bumagsak lahat" + button_confirm: "Confirm" button_configure: "I-configure" button_continue: "Ipagpatuloy" button_complete: "Complete" @@ -2168,6 +2207,7 @@ fil: button_print: "I-print" button_quote: "Quote" button_remove: Tanggalin + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Baguhin ang pangalan" button_replace: "Palitan" @@ -2419,7 +2459,7 @@ fil: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ fil: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ fil: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ fil: custom_actions: title: "Mga custom aksyon" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ fil: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ fil: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ fil: instructions_after_error: "Maaring mong subukan muli sa pamamagitan ng pagpipindut %{signin}. kung ang mali ay nagpatuloy, magtanong sa namuno para sa tulong." menus: admin: - mail_notification: "Mga abiso ng emailba" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Mga abiso ng emailba" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Walang access token upang ipakita" description: "Lahat sila ay hindi na pinagana. Maaari silang paganahin muli sa pagpilian ng tagapangasiwa." @@ -2909,34 +2956,56 @@ fil: expiration: "Natapos" indefinite_expiration: "Hindi kailanman" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ fil: label_always_visible: "Palaging ipinapakita" label_announcement: "Anunsyo" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key ay nilikha %{value} ng nakalipas" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ fil: label_journal_diff: "Paglalarawan ng paghahambing" label_language: "Linggwahe" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Tumalon sa isang proyekto..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ fil: label_project_hierarchy: "Proyektong hierarchy" label_project_mappings: "Mga proyekto" label_project_new: "Bagong proyekto" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Mga proyekto" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ fil: notice_not_authorized: "Hindi ka inanyayahan na i-access ang pahina na ito." notice_not_authorized_archived_project: "Ang iyong proyekto na sinusubukan mong i-access ay na archive na." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Ang iyong password ay hindi tama. Hindi maaring magpatuloy." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Mayroong %{number} mga resulta ang natagpuan.\n Ang tab ay tumuon sa unang resulta." notice_principals_found_single: "Mayroong isang resulta. \n Tab upang ituon ito." notice_parent_item_not_found: "Parent item not found." @@ -4247,6 +4315,9 @@ fil: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4259,11 +4330,17 @@ fil: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentasyon" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4448,7 +4525,7 @@ fil: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4554,7 +4631,7 @@ fil: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4722,6 +4799,7 @@ fil: 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: "Kinakailangan mong alisin ang ilan o lahat ng iyong perniso at hindi na maaring magagawa na i-edit ang itong proyekto pagkatapos na iyan.\nSigurado ka ba gusto mong magpatuloy?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin asstes directory writable" text_powered_by: "Pinalatakbo ng %{link}" text_project_identifier_info: "Maliit na titik lamang (a-z), mga numero, mga dash at underscore ang pinahintulutan, dapat magsimula sa maliit na titik." @@ -5218,3 +5296,8 @@ fil: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/fr.seeders.yml b/config/locales/crowdin/fr.seeders.yml index cbea4fbf289..8648ec98b8c 100644 --- a/config/locales/crowdin/fr.seeders.yml +++ b/config/locales/crowdin/fr.seeders.yml @@ -492,14 +492,14 @@ fr: Fonctionnalités principales et cas d'utilisation : - * [Gestion de portefeuille de projets] (https://www.openproject.org/collaboration-software-features/project-portfolio-management/) - * [Planification et organisation de projets](https://www.openproject.org/collaboration-software-features/project-planning-scheduling/) - * [Gestion des tâches et suivi des problèmes](https://www.openproject.org/collaboration-software-features/task-management/) - * [Tableaux agiles (Scrum et Kanban)](https://www.openproject.org/collaboration-software-features/agile-project-management/) - * [Gestion des exigences et planification des versions](https://www.openproject.org/collaboration-software-features/product-development/) - * [Suivi du temps et des coûts, budgets](https://www.openproject.org/collaboration-software-features/time-tracking/) - * [Collaboration d'équipe et documentation](https://www.openproject.org/collaboration-software-features/team-collaboration/) + * [Gestion de portefeuille de projets](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/gestion-portefeuille-projets/) + * [Planification et organisation de projets](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/planification-ordonnancement-projet/) + * [Gestion des tâches et suivi des problèmes](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/gestion-des-taches/) + * [Tableaux agiles (Scrum et Kanban)](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/gestion-projet-agile/) + * [Gestion des exigences et planification des versions](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/developpement-de-produits/) + * [Suivi du temps et des coûts, budgets](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/suivi-du-temps/) + * [Collaboration d'équipe et documentation](https://www.openproject.org/fr/fonctionnalites-collaboration-logiciel/collaboration-equipe/) Bienvenue dans l'avenir de la gestion de projet. - Pour les administrateurs : Vous pouvez modifier ce texte de bienvenue [ici] ({{opSetting:base_url}}/admin/settings/general). + Pour les administrateurs : vous pouvez modifier ce texte de bienvenue [ici]({{opSetting:base_url}}/admin/settings/general). diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 20c49dc3aa6..8b02f5d1a22 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -109,6 +109,23 @@ fr: explanation: text: "Les actions individuelles d'un utilisateur (par ex. mis à jour un lot de travaux deux fois) sont agrégés en une seule action si leur différence d'âge est inférieure à la période spécifiée. Elles seront affichées en une seule action dans l'application. Cela retardera également les notifications du même temps réduisant donc le nombre d'e-mails envoyés et affectera également le délai %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "Le protocole de contexte de modèle permet aux agents d'intelligence artificielle de fournir à leurs utilisateurs les outils et les ressources exposés par cette instance d'OpenProject." + resources_heading: "Ressources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Mettre à jour les ressources" + tools_heading: "Outils" + tools_description: "OpenProject implémente les outils suivants. Chacun d'entre eux peut être activé, renommé et décrit comme vous le souhaitez. Pour en savoir plus, veuillez vous référer à la [documentation sur les outils MCP](docs_url)." + tools_submit: "Mettre à jour les outils" + multi_update: + success: "Les configurations MCP ont été mises à jour avec succès." + server_form: + description_caption: "Comment le serveur MCP sera décrit aux autres applications qui s'y connectent." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "La configuration MCP n'a pas pu être mise à jour." + success: "La configuration MCP a été mise à jour avec succès." scim_clients: authentication_methods: sso: "JWT du fournisseur d'identité" @@ -591,6 +608,7 @@ fr: is_for_all_blank_slate: heading: Pour tous les projets description: Cet attribut de projet est activé dans tous les projets, car l'option « Pour tous les projets » est cochée. Il ne peut pas être désactivé pour les projets individuels. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Il n'y a actuellement aucun type disponible. form: @@ -605,6 +623,9 @@ fr: work_package_priorities: new_label: "Nouvelle priorité" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "L'artefact généré sera enregistré en tant que pièce jointe au format PDF dans le lot de travaux de l'artefact." description_file_link_export: "Le lot de travaux de l'artefact contient un lien vers un fichier PDF stocké dans un espace de stockage de fichiers externe. Nécessite un stockage de fichiers de travail avec des dossiers de projet gérés automatiquement pour ce projet. Pour le moment, seuls les espaces de stockage de fichiers Nextcloud sont pris en charge." @@ -618,6 +639,7 @@ fr: label_request_submission: "Demande d'envoi" project_attributes_description: > Sélectionnez les attributs du projet à inclure dans la demande de lancement du projet. Cette liste ne comprend que les [attributs du projet](project_attributes_url) activés pour ce projet. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Modifier le statut wizard: @@ -713,9 +735,11 @@ fr: create_button: "Créer" name_label: "Nom du jeton" created_dialog: + one_time_warning: "C'est la seule fois que vous verrez ce jeton. Veillez à le copier maintenant." token/api: title: "Le jeton d'API a été généré" - warning: "Note : Ceci est la seule fois où vous verrez ce jeton, veuillez le copier maintenant." + token/rss: + title: "Le jeton RSS a été généré" failed_to_reset_token: "Impossible de réinitialiser le jeton d’accès : %{error}" failed_to_create_token: "Impossible de créer le jeton d'accès : %{error}" failed_to_revoke_token: "Impossible de révoquer le jeton d'accès : %{error}" @@ -725,6 +749,9 @@ fr: notice_api_token_revoked: "Le jeton d'API a été supprimé. Pour créer un nouveau jeton, veuillez utiliser le bouton dans la section API." notice_rss_token_revoked: "Le jeton d'API a été supprimé. Pour créer un nouveau jeton, veuillez utiliser le lien dans la section RSS." notice_ical_token_revoked: 'Le jeton iCalendar « %{token_name} » pour le calendrier « %{calendar_name} » du projet « %{project_name} » a été révoqué. L''URL iCalendar liée à ce jeton est maintenant invalide.' + password_confirmation_dialog: + confirmation_required: "Vous devez saisir le mot de passe de votre compte pour confirmer cette modification." + title: "Confirmez votre mot de passe pour continuer" news: index: no_results_title_text: Il n'y a actuellement aucune actualité à publier. @@ -1229,6 +1256,10 @@ fr: onthefly: "Création automatique des utilisateurs" port: "Port" tls_certificate_string: "Certificat SSL du serveur LDAP" + mcp_configuration: + enabled: Activé + title: Titre + description: Description member: roles: "Rôles" notification: @@ -1487,6 +1518,7 @@ fr: even: "doit être pair." exclusion: "est réservé." feature_disabled: n'est pas disponible. + feature_disabled_for_project: est désactivé pour ce projet. file_too_large: "est trop volumineux (la taille maximale est de %{count} octets)." filter_does_not_exist: "le filtre n'existe pas." format: "ne correspond pas au format attendu « %{expected} »." @@ -1509,7 +1541,8 @@ fr: not_a_datetime: "n'est pas une heure valide." not_a_number: "n'est pas un nombre." not_allowed: "est invalide en raison d’autorisations insuffisantes." - not_json: "n'est pas un objet JSON valide." + not_json: "ne peut pas être analysé en tant que JSON." + not_json_object: "n'est pas un objet JSON." not_an_integer: "n'est pas un entier." not_an_iso_date: "n’est pas une date valide. Format requis : AAAA-MM-JJ." not_same_project: "n'appartient pas au même projet." @@ -1917,7 +1950,12 @@ fr: token/api: one: Jeton d'accès other: Jetons d’accès - type: "Type" + token/rss: + one: "Jeton RSS" + other: "Jetons RSS" + type: + one: "Type" + other: "Types" user: "Utilisateur" version: "Version" workflow: "Flux de travail" @@ -2134,6 +2172,7 @@ fr: button_click_to_reveal: "Cliquez pour révéler" button_close: "Fermer" button_collapse_all: "Tout replier" + button_confirm: "Confirmer" button_configure: "Configurer" button_continue: "Continuer" button_complete: "Compléter" @@ -2166,6 +2205,7 @@ fr: button_print: "Imprimer" button_quote: "Citer" button_remove: Supprimer + button_remove_permanently: "Supprimer définitivement" button_remove_reminder: "Supprimer le rappel" button_rename: "Renommer" button_replace: "Remplacer" @@ -2417,7 +2457,7 @@ fr: baseline_comparison: Comparaisons de référence board_view: Tableaux avancés calculated_values: Valeurs calculées - conditional_highlighting: Mise en surbrillance conditionnelle + capture_external_links: Capturer les liens externes internal_comments: Commentaires internes custom_actions: Actions personnalisées custom_field_hierarchies: Hiérarchies @@ -2427,10 +2467,12 @@ fr: edit_attribute_groups: Modifier les groupes d'attributs gantt_pdf_export: Exportation PDF de diagramme de Gantt ldap_groups: Synchronisation des utilisateurs LDAP et des groupes + mcp_server: Serveur MCP nextcloud_sso: Authentification unique pour le stockage Nextcloud one_drive_sharepoint_file_storage: Stockage de fichiers OneDrive/SharePoint placeholder_users: Utilisateurs fictifs portfolio_management: Gestion du portefeuille + project_creation_wizard: Demande de lancement du projet project_list_sharing: Partage de liste de projets readonly_work_packages: Lots de travaux en lecture seule scim_api: API du serveur SCIM @@ -2471,8 +2513,8 @@ fr: description: "Créez des sujets générés automatiquement à l'aide d'attributs et de textes référencés." customize_life_cycle: description: "Créez et organisez des phases de projet différentes de celles fournies par la planification du cycle de projet PM2." - conditional_highlighting: - description: "Vous avez besoin que certains lots de travaux se démarquent de la masse ? Utilisez la mise en évidence conditionnelle dans le tableau des lots de travaux." + capture_external_links: + description: "Prévenez les attaques d'ingénierie sociale en capturant et en avertissant les utilisateurs des liens externes avant qu'ils ne les consultent." work_package_query_relation_columns: description: "Vous avez besoin de voir les relations ou les éléments enfants dans la liste des lots de travaux ?" edit_attribute_groups: @@ -2502,6 +2544,8 @@ fr: custom_actions: title: "Actions personnalisées" description: "Les actions personnalisées sont des raccourcis en un clic vers un ensemble d'actions prédéfinies que vous pouvez rendre disponibles sur certains lots de travaux en fonction de l'état, du rôle, du type ou du projet." + mcp_server: + description: "Intégrez des agents d'intelligence artificielle à votre instance OpenProject grâce à MCP." nextcloud_sso: title: "Authentification unique pour le stockage Nextcloud" description: "Activez l'authentification transparente et sécurisée pour votre stockage Nextcloud avec l'authentification unique. Simplifiez la gestion des accès et augmentez la commodité des utilisateurs." @@ -2513,6 +2557,8 @@ fr: description: "Permettez aux utilisateurs de se connecter via des fournisseurs SSO externes utilisant SAML ou OpenID Connect pour assurer un accès transparent et une intégration fluide avec les systèmes d'identité existants." virus_scanning: description: "Assurez-vous que les fichiers téléversés dans OpenProject sont analysés pour détecter les virus avant d'être accessibles aux autres utilisateurs." + project_creation_wizard: + description: "Générez un assistant étape par étape pour aider les responsables de projet à remplir une demande de lancement de projet." placeholder_users: title: Utilisateurs fictifs description: > @@ -2810,19 +2856,17 @@ fr: learn_about: "En savoir plus sur les nouvelles fonctionnalités" missing: "Il n'y a pas encore de fonctionnalités mises en évidence." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > - Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que : + Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que: new_features_list: - line_0: Collaboration en temps réel sur les documents. - line_1: Possibilité de structurer des projets connexes en programmes et en portefeuilles afin de les axer sur des objectifs stratégiques (add-on Enterprise). - line_2: Meilleure gestion des réunions grâce au mode brouillon, au mode présentation, aux résultats améliorés et à l'abonnement iCal. - line_3: Mise à jour de l'intégration de SharePoint avec des permissions plus restrictives (add-on Enterprise). - line_4: Refonte de la vue d'ensemble du projet avec de nouveaux onglets, des widgets configurables et une mise en page améliorée. - line_5: Possibilité de protéger plus strictement la vie privée des utilisateurs qui ne travaillent pas sur le même projet. - line_6: Amélioration du flux de création de projets avec une meilleure sélection des modèles. - line_7: Recherche globale plus intelligente incluant le type et le statut afin d'améliorer la précision dans plusieurs outils de saisie automatique. - line_8: Amélioration de l'accessibilité des textes ALT et des couleurs des graphiques. + line_0: Lancement automatisé de projets (module complémentaire Enterprise). + line_1: "Réunions : ajoutez des work packages nouveaux ou existants en tant que résultats." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Réunions récurrentes : dupliquez les points de l'ordre du jour lors de la prochaine réunion." + line_4: "Mise à disposition de la Communauté : Mise en évidence des attributs." + line_5: Avertissement avant l'ouverture de liens externes dans le contenu fourni par l'utilisateur (module complémentaire Enterprise). + line_6: Amélioration des performances et de l'expérience utilisateur, y compris l'onglet Activité et le module Documents. links: upgrade_enterprise_edition: "Passer à la version Enterprise" postgres_migration: "Migration de votre installation vers PostgreSQL" @@ -2890,14 +2934,17 @@ fr: instructions_after_error: "Vous pouvez encore essayer de vous authentifier en cliquant sur %{signin}. Si l'erreur persiste, demandez de l'aide à votre administrateur." menus: admin: - mail_notification: "Notifications par e-mail" - mails_and_notifications: "E-mails et notifications" + ai: "Intelligence artificielle (IA)" aggregation: "Agrégation" api_and_webhooks: "API et webhooks" + mail_notification: "Notifications par e-mail" + mails_and_notifications: "E-mails et notifications" + mcp_configurations: "Protocole de contexte de modèle (MCP)" quick_add: label: "Ajouter…" my_account: access_tokens: + description: "Les jetons de fournisseur sont émis par OpenProject, ce qui permet à d'autres applications d'y accéder. Les jetons clients sont émis par d'autres applications, permettant à OpenProject d'y accéder." no_results: title: "Aucun jeton d'accès à afficher" description: "Tous ont été désactivés. Ils peuvent être ré-activés dans le menu d'administration." @@ -2907,34 +2954,56 @@ fr: expiration: "Expiration" indefinite_expiration: "Jamais" simple_revoke_confirmation: "Voulez-vous vraiment révoquer ce jeton ?" + tabs: + client: + title: "Jetons de client" + provider: + title: "Jetons du fournisseur" token/api: + blank_description: "Il n'y a pas encore de jeton API. Vous pouvez en créer un en utilisant le bouton ci-dessous." + blank_title: "Pas de jeton API" title: "API" + table_title: "Jetons d'API" text_hint: "Les jetons d'API permettent aux applications tierces de communiquer avec cette instance OpenProject via les API REST." + static_token_name: "Jeton API" disabled_text: "Les jetons d'API ne sont pas activés par l'administrateur. Veuillez contacter votre administrateur pour utiliser cette fonctionnalité." add_button: "Jeton d'API" - api: - static_token_name: "Jeton d'API" ical: + blank_description: "Pour ajouter un jeton iCalendar, abonnez-vous à un calendrier nouveau ou existant à partir du module Calendrier d'un projet. Vous devez disposer des autorisations nécessaires." + blank_title: "Pas de jeton iCalendar" title: "iCalendar" + table_title: "Jetons iCalendar" text_hint_link: "Les jetons iCalendar permettent aux utilisateurs de [s'abonner aux calendriers OpenProject](docs_url) et d'afficher des informations à jour sur les lots de travaux provenant de clients externes." disabled_text: "Les abonnements iCalendar ne sont pas activés par l'administrateur. Veuillez contacter votre administrateur pour utiliser cette fonctionnalité." - empty_text_hint: "Pour ajouter un jeton iCalendar, abonnez-vous à un nouveau calendrier ou à un calendrier existant depuis le module Calendrier d'un projet. Vous devez avoir les autorisations nécessaires." - oauth: + oauth_application: + active_tokens: "Jetons actifs" + blank_description: "Aucun accès à une application tierce n'est configuré et actif pour vous." + blank_title: "Pas de jeton d'application OAuth" + last_used_at: "Dernière utilisation à" title: "OAuth" - text_hint: "Les jetons OAuth permettent à des applications tierces de se connecter à cette instance OpenProject." - empty_text_hint: "Il n'y a pas d'accès à des applications tierces configuré et actif pour vous. Veuillez contacter votre administrateur pour activer cette fonctionnalité." - rss: - title: "RSS" - text_hint: "Les jetons RSS permettent aux utilisateurs de suivre les derniers changements de cette instance OpenProject via un lecteur RSS externe." + table_title: "Jetons d'application OAuth" + text_hint: "Les jetons d'application OAuth permettent aux applications tierces de se connecter à cette instance d'OpenProject." + oauth_client: + blank_description: "Il n'y a pas encore de jetons clients OAuth." + blank_title: "Pas de jeton client OAuth" + failed: "Une erreur s'est produite et le jeton n'a pas pu être supprimé. Veuillez réessayer plus tard." + integration_type: "Type d'intégration" + table_title: "Jetons clients OAuth" + text_hint: "Les jetons clients OAuth permettent à cette instance d'OpenProject de se connecter à des applications externes, telles que des stockages de fichiers." + title: "OAuth" + remove_token: "Voulez-vous vraiment supprimer ce jeton ? Vous devrez vous connecter à nouveau sur %{integration}." + removed: "Le jeton client OAuth a été supprimé avec succès" + unknown_integration: "Inconnu" + token/rss: + add_button: "Jeton RSS" + blank_description: "Il n'y a pas encore de jeton RSS. Vous pouvez en créer un en utilisant le bouton ci-dessous." + blank_title: "Pas de jeton RSS" + title: "Flux RSS" + table_title: "Jeton RSS" + text_hint: "Les jetons RSS permettent aux utilisateurs de se tenir au courant des derniers changements dans cette instance d'OpenProject via un lecteur RSS externe." static_token_name: "Jeton RSS" disabled_text: "Les jetons RSS ne sont pas activés par l'administrateur. Veuillez contacter votre administrateur pour utiliser cette fonctionnalité." storages: - title: "Espaces de stockage de fichiers" - text_hint: "Les jetons de stockage de fichiers connectent cette instance OpenProject à une solution de stockage de fichiers externe." - empty_text_hint: "Il n'y a pas d'accès à l'espace de stockage lié à votre compte." - revoke_token: "Voulez-vous vraiment supprimer ce jeton ? Vous devrez vous reconnecter sur %{storage}" - removed: "Jeton de stockage de fichiers supprimé avec succès" - failed: "Une erreur s'est produite et le jeton n'a pas pu être supprimé. Veuillez réessayer plus tard." unknown_storage: "Espace de stockage inconnu" notifications: reasons: @@ -2996,6 +3065,7 @@ fr: label_always_visible: "Toujours affiché" label_announcement: "Annonce ou avis. " label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Clé d'accès API" label_api_access_key_created_on: "Clé d'accès API créé il y a %{value}" label_api_access_key_type: "API" @@ -3251,6 +3321,7 @@ fr: label_journal_diff: "Comparaison de description" label_language: "Langue" label_languages: "Langues" + label_external_links: "Liens externes" label_locale: "Langue et région" label_jump_to_a_project: "Aller à un projet…" label_keyword_plural: "Mots clés" @@ -3428,9 +3499,6 @@ fr: label_project_hierarchy: "Hiérarchie du projet" label_project_mappings: "Projets" label_project_new: "Nouveau projet" - label_project_initiation_request: "Demande de lancement d'un nouveau projet" - label_project_creation_wizard: "Assistant de création de nouveau projet" - label_project_mandate: "Mandat de nouveau projet" label_project_plural: "Projets" label_project_list_plural: "Listes de projets" label_project_life_cycle: "Cycle de vie du projet" @@ -3894,7 +3962,7 @@ fr: notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page." notice_not_authorized_archived_project: "Le projet auquel vous essayer d'accéder a été archivé." notice_requires_enterprise_token: "Le jeton Enterprise est manquant ou n'autorise pas l'accès à cette page." - notice_password_confirmation_failed: "Votre mot de passe est incorrect. Impossible de continuer." + notice_password_confirmation_failed: "Le mot de passe saisi est incorrect." notice_principals_found_multiple: "Il y a %{number} résultats trouvés. Tabulation pour sélectionner le premier résultat." notice_principals_found_single: "Il y a un seul résultat. Tabulation pour le sélectionner." notice_parent_item_not_found: "L'élément parent est introuvable." @@ -4247,6 +4315,9 @@ fr: setting_allowed_link_protocols: "Protocoles de lien autorisés" setting_allowed_link_protocols_text_html: >- Permettre que ces protocoles soient affichés sous forme de liens dans les descriptions des lots de travaux, les champs de texte long et les commentaires. Par exemple, %{tel_code} ou %{element_code}. Saisissez un protocole par ligne.
    Les protocoles %{http_code}, %{https_code} et %{mailto_code} sont toujours autorisés. + setting_capture_external_links: "Saisir les liens externes" + setting_capture_external_links_text: > + Lorsque cette option est activée, tous les liens externes en texte formaté sont redirigés vers une page d'avertissement avant de quitter l'application. Cela permet de protéger les utilisateurs contre les sites web externes potentiellement malveillants. setting_after_first_login_redirect_url: "Redirection de première connexion" setting_after_first_login_redirect_url_text_html: > Définissez un chemin pour rediriger les utilisateurs après leur première connexion. S’il est vide, les utilisateurs seront redirigés vers la page d'accueil de la visite d'intégration.
    Exemple : /my/page @@ -4259,11 +4330,17 @@ fr: setting_apiv3_cors_origins_text_html: > Si CORS est activé, ce sont les origines qui sont autorisées à accéder à l'API OpenProject.
    Veuillez vérifier la documentation sur l'en-tête Origin sur la façon de spécifier les valeurs attendues. setting_apiv3_write_readonly_attributes: "Accès en écriture aux attributs en lecture seule" - setting_apiv3_write_readonly_attributes_instructions_html: > - Si cette option est activée, l'API permettra aux administrateurs d'écrire des attributs statiques en lecture seule lors de la création, tels que createdAt et author.
    Avertissement : Ce paramètre est utile, par exemple, pour l'importation de données, mais il permet aux administrateurs de se faire passer pour d'autres utilisateurs lors de la création d'éléments. Toutes les demandes de création sont toutefois enregistrées au nom du véritable auteur.
    Pour plus d'informations sur les attributs et les ressources prises en charge, veuillez consulter la %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Si cette option est activée, l'API permettra aux administrateurs d'écrire des attributs statiques en lecture seule lors de la création, tels que createdAt et author. + setting_apiv3_write_readonly_attributes_warning: > + Ce paramètre est utile, par exemple, pour l'importation de données, mais il permet aux administrateurs de se faire passer pour d'autres utilisateurs lors de la création d'éléments. Toutes les demandes de création sont toutefois enregistrées avec le véritable auteur. + setting_apiv3_write_readonly_attributes_additional: > + Pour plus d'informations sur les attributs et les ressources prises en charge, veuillez consulter le site %{api_documentation_link}. setting_apiv3_max_page_size: "Taille maximale de page d'API" - setting_apiv3_max_page_instructions_html: > - Définissez la taille maximale de la page avec laquelle l'API répondra. Il ne sera pas possible d'effectuer des requêtes API qui retournent plus de valeurs sur une seule page.
    Avertissement : veuillez modifier cette valeur uniquement si vous êtes sûr de savoir pourquoi vous en avez besoin. Définir à une valeur élevée entraînera des impacts significatifs sur les performances, alors qu'une valeur inférieure aux options de chaque page provoquera des erreurs dans les vues paginées. + setting_apiv3_max_page_size_instructions: > + Définissez la taille maximale de la page à laquelle l'API répondra. Il ne sera pas possible d'effectuer des demandes d'API qui renvoient plus de valeurs sur une seule page. + setting_apiv3_max_page_size_warning: > + Ne modifiez cette valeur que si vous êtes certain d'en avoir besoin. Une valeur élevée aura un impact significatif sur les performances, tandis qu'une valeur inférieure aux options par page provoquera des erreurs dans les vues paginées. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Activer la page docs" setting_apiv3_docs_enabled_instructions_html: > @@ -4448,7 +4525,7 @@ fr: omniauth_direct_login_hint_html: > Si cette option est activée, les demandes de connexion seront redirigées vers le fournisseur omniauth configuré. La liste déroulante de connexion et la page de connexion seront désactivées.
    Remarque : lorsque cette option est activée, les utilisateurs peuvent toujours se connecter en interne en visitant la page de connexion %{internal_path}, sauf si vous désactivez également les connexions par mot de passe. remapping_existing_users_hint: > - Si cette option est activée, elle permet à tout fournisseur d'identité configuré de connecter des utilisateurs existants en fonction de leur adresse e-mail, même si l'utilisateur ne s'est jamais connecté auparavant via ce fournisseur. Cela peut être utile lors de la migration de l'instance OpenProject vers un nouveau fournisseur SSO, mais n'est pas recommandé si vous utilisez un fournisseur qui n'est pas approuvé par l'ensemble des utilisateurs de votre instance. + Si activé, permet à tout fournisseur d'identité configuré de connecter les utilisateurs existants en se basant sur leur nom d'utilisateur, même si l'utilisateur ne s'est jamais connecté via ce fournisseur auparavant. Ceci peut être utile lors de la migration de l'instance OpenProject vers un nouveau fournisseur SSO, mais n'est pas recommandé lors de l'utilisation d'un fournisseur qui n'est pas reconnu par tous les utilisateurs de votre instance. attachments: whitelist_text_html: > Définissez une liste d'extensions de fichiers et/ou de types MIME valides pour les fichiers téléversés.
    Entrez les extensions de fichier (par exemple, %{ext_example}) ou les types mime (par exemple, %{mime_example}).
    Laissez vide pour permettre le téléversement de tout type de fichier. Plusieurs valeurs autorisées (une ligne pour chaque valeur). @@ -4554,7 +4631,7 @@ fr: project_mandate: "Mandat du projet" submission: description_template: > - **Ce lot de travaux a été créé automatiquement à l'issue du flux de travail %{wizard_name}.** Un artefact PDF contenant toutes les informations envoyées a été généré et joint à ce lot de travaux à des fins de référence et d'audit. Si vous avez besoin de mettre à jour ou de réexécuter les étapes de lancement, vous pouvez rouvrir l'assistant à tout moment en utilisant le lien ci-dessous : + **Ce dossier de travail a été créé automatiquement à l'issue du flux de travail %{wizard_name} .** Un artefact PDF contenant toutes les informations soumises a été généré et joint à ce dossier de travail à des fins de référence et d'audit. Si vous avez besoin de mettre à jour ou de réexécuter les étapes d'initiation, vous pouvez rouvrir l'assistant à tout moment en utilisant le lien ci-dessous : description: "Lorsqu'un utilisateur envoie une demande de lancement de projet, un nouveau lot de travail est créé avec l'artefact de la demande en pièce jointe au format PDF. Les paramètres ci-dessous définissent le type, le statut et le destinataire de ce nouveau lot de travaux." work_package_type: "Type de lot de travaux" work_package_type_caption: "Le type de lot de travaux qui doit être utilisé pour stocker l'artefact terminé." @@ -4722,6 +4799,7 @@ fr: Remarque : si cette option est activée, un badge indiquant l'état de votre installation s'affichera dans le panneau %{information_panel_label} administration et sur la page d'accueil. Il n'est affiché que pour les administrateurs.
    Le badge vérifiera votre version actuelle d'OpenProject par rapport à la base de données officielle d'OpenProject pour vous avertir de toute mise à jour ou vulnérabilité connue. Pour plus d'informations sur ce que la vérification fournit, quelles données sont nécessaires pour fournir les mises à jour disponibles, et comment désactiver cette vérification, veuillez visiter la documentation de configuration. text_own_membership_delete_confirmation: "Vous êtes sur le point de retirer tout ou partie de vos permissions et ne pourrez peut-être plus modifier le projet par la suite.\nÊtes vous sûr de vouloir continuer?" text_permanent_delete_confirmation_checkbox_label: "Je comprends que cette suppression ne peut pas être annulée" + text_permanent_remove_confirmation_checkbox_label: "Je comprends que cette suppression ne peut pas être annulée" text_plugin_assets_writable: "Répertoire des « plugin assets » est accessible en écriture" text_powered_by: "Propulsé par %{link}" text_project_identifier_info: "Seulement les lettres en minuscule (a-z), les nombres, les tirets et les underscores sont autorisés, il est obligatoire de commencer avec une lettre en minuscule." @@ -4812,8 +4890,8 @@ fr: other: "verrouillé temporairement (%{count} tentatives de connexion échouées)" confirm_status_change: "Vous êtes sur le point de changer le statut de '%{name}'. Voulez-vous vraiment continuer ?" deleted: "Utilisateur supprimé" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Vous ne pouvez pas modifier votre propre statut d'utilisateur." + error_admin_change_on_non_admin: "Seuls les administrateurs peuvent modifier le statut des utilisateurs administrateurs." error_status_change_failed: "Le changement du statut de l'utilisateur a échoué dû aux erreurs suivantes: %{errors}" invite: Inviter l'utilisateur par e-mail invited: invité @@ -5217,3 +5295,8 @@ fr: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Quitter OpenProject" + warning_message: "Vous êtes sur le point de quitter OpenProject et de visiter un site web externe. Veuillez noter que les sites web externes ne sont pas sous notre contrôle et peuvent avoir des politiques de confidentialité et de sécurité différentes." + continue_message: "Êtes-vous sûr de vouloir passer au lien externe suivant ?" + continue_button: "Continuer vers le site web externe" diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index b0465cb08f4..891fc7cdc34 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -109,6 +109,23 @@ he: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -593,6 +610,7 @@ he: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -607,6 +625,9 @@ he: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -620,6 +641,7 @@ he: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -727,9 +749,11 @@ he: create_button: "צור" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -739,6 +763,9 @@ he: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1249,6 +1276,10 @@ he: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "תפקידים" notification: @@ -1507,6 +1538,7 @@ he: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1529,7 +1561,8 @@ he: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1963,7 +1996,16 @@ he: two: Access tokens many: Access tokens other: Access tokens - type: "סוג" + token/rss: + one: "RSS token" + two: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + two: "Types" + many: "Types" + other: "Types" user: "משתמש" version: "גירסה" workflow: "זרימת עבודה" @@ -2188,6 +2230,7 @@ he: button_click_to_reveal: "Click to reveal" button_close: "סגירה" button_collapse_all: "סגור הכל" + button_confirm: "Confirm" button_configure: "הגדר" button_continue: "Continue" button_complete: "Complete" @@ -2220,6 +2263,7 @@ he: button_print: "Print" button_quote: "צטט" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "שינוי שם" button_replace: "Replace" @@ -2511,7 +2555,7 @@ he: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2521,10 +2565,12 @@ he: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2565,8 +2611,8 @@ he: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2596,6 +2642,8 @@ he: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2607,6 +2655,8 @@ he: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2906,19 +2956,17 @@ he: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2986,14 +3034,17 @@ he: instructions_after_error: "באפשרותך לנסות לבצע כניסה שוב על ידי לחיצה על %{signin}. אם השגיאה נמשכת, בקש עזרה שלך admin." menus: admin: - mail_notification: "התראות דוא\"ל" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "התראות דוא\"ל" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -3003,34 +3054,56 @@ he: expiration: "Expires" indefinite_expiration: "אף פעם" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3092,6 +3165,7 @@ he: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "מפתח גישה API" label_api_access_key_created_on: "API מקשים שנוצרה לפני %{value}" label_api_access_key_type: "API" @@ -3347,6 +3421,7 @@ he: label_journal_diff: "Description Comparison" label_language: "שפה" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "קפוץ אל פרוייקט..." label_keyword_plural: "Keywords" @@ -3524,9 +3599,6 @@ he: label_project_hierarchy: "Project hierarchy" label_project_mappings: "פרויקטים" label_project_new: "פרוייקט חדש" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "פרויקטים" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3992,7 +4064,7 @@ he: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4347,6 +4419,9 @@ he: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4359,11 +4434,17 @@ he: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4548,7 +4629,7 @@ he: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4654,7 +4735,7 @@ he: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4822,6 +4903,7 @@ he: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5322,3 +5404,8 @@ he: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index c8a83128350..6a9508fce44 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -109,6 +109,23 @@ hi: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ hi: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ hi: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ hi: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ hi: create_button: "रचना करें" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ hi: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1229,6 +1256,10 @@ hi: onthefly: "Automatic user creation" port: "पोर्ट" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "भूमिकाएं" notification: @@ -1487,6 +1518,7 @@ hi: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1509,7 +1541,8 @@ hi: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "अनुपलब्ध अनुमतियों के कारण अमांय है ।" - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1917,7 +1950,12 @@ hi: token/api: one: Access token other: Access tokens - type: "प्रकार" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "उपयोगकर्ता" version: "संस्करण" workflow: "कार्यप्रवाह" @@ -2134,6 +2172,7 @@ hi: button_click_to_reveal: "Click to reveal" button_close: "बंद करें" button_collapse_all: "सभी को समेटें" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2166,6 +2205,7 @@ hi: button_print: "Print" button_quote: "उद्धरण" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "नाम बदलें" button_replace: "Replace" @@ -2417,7 +2457,7 @@ hi: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2427,10 +2467,12 @@ hi: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2471,8 +2513,8 @@ hi: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2502,6 +2544,8 @@ hi: custom_actions: title: "विशेष या कस्टम क्रियाएँ" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2513,6 +2557,8 @@ hi: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2810,19 +2856,17 @@ hi: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2890,14 +2934,17 @@ hi: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "ईमेल की सूचनाएँ" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "ईमेल की सूचनाएँ" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2907,34 +2954,56 @@ hi: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2996,6 +3065,7 @@ hi: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API पहुंच कुंजी" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3251,6 +3321,7 @@ hi: label_journal_diff: "विवरण तुलना" label_language: "भाषा " label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "किसी प्रोजेक्ट पर जंप करें..." label_keyword_plural: "Keywords" @@ -3428,9 +3499,6 @@ hi: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "नया प्रोजेक्ट" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3894,7 +3962,7 @@ hi: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4247,6 +4315,9 @@ hi: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4259,11 +4330,17 @@ hi: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4448,7 +4525,7 @@ hi: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4554,7 +4631,7 @@ hi: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4722,6 +4799,7 @@ hi: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5218,3 +5296,8 @@ hi: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index e9373e52700..428024bfe29 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -109,6 +109,23 @@ hr: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -592,6 +609,7 @@ hr: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Trenutno nema dostupnih tipova. form: @@ -606,6 +624,9 @@ hr: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,6 +640,7 @@ hr: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -720,9 +742,11 @@ hr: create_button: "Stvori" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Ne mogu postaviti pristupni token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -732,6 +756,9 @@ hr: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Nema novih vijesti. @@ -1240,6 +1267,10 @@ hr: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Role" notification: @@ -1498,6 +1529,7 @@ hr: even: "mora biti izjednačeno." exclusion: "je rezerviran." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "je prevelik (maksimalna veličina iznosi %{count} bajta)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1520,7 +1552,8 @@ hr: not_a_datetime: "is not a valid date time." not_a_number: "nije tip podataka number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "nije tip podatka integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "ne pripada istom projektu." @@ -1941,7 +1974,14 @@ hr: one: Pristupni token few: Access tokens other: Access tokens - type: "Tip" + token/rss: + one: "RSS token" + few: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + other: "Types" user: "Korisnik" version: "Verzija" workflow: "Tijek rada" @@ -2162,6 +2202,7 @@ hr: button_click_to_reveal: "Click to reveal" button_close: "Zatvori" button_collapse_all: "Sažmi sve" + button_confirm: "Confirm" button_configure: "Postavi" button_continue: "Nastavi" button_complete: "Complete" @@ -2194,6 +2235,7 @@ hr: button_print: "Ispis" button_quote: "Citiraj" button_remove: Ukloni + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Preimenuj" button_replace: "Zamijeni" @@ -2465,7 +2507,7 @@ hr: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2475,10 +2517,12 @@ hr: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2519,8 +2563,8 @@ hr: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2550,6 +2594,8 @@ hr: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2561,6 +2607,8 @@ hr: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2859,19 +2907,17 @@ hr: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2939,14 +2985,17 @@ hr: instructions_after_error: "Da bi ste se ponovno pokušali ulogirati kliknite %{signin}. Ukoliko je greška i dalje prisutna, molim vas obratite se administratoru za pomoć." menus: admin: - mail_notification: "Obavijesti e-mailom" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Obavijesti e-mailom" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Trenutno ne postoji pristupni token za prikaz" description: "Svi pristupni tokeni su onemogućeni. Za ponovno omogućavanje, koristite administracijski izbornik." @@ -2956,34 +3005,56 @@ hr: expiration: "Vrijedi do" indefinite_expiration: "Nikad" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3045,6 +3116,7 @@ hr: label_always_visible: "Uvijek se prikazuje" label_announcement: "Obavijest" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API pristupni ključ" label_api_access_key_created_on: "API pristupni ključ kreiran %{value} prije" label_api_access_key_type: "API" @@ -3300,6 +3372,7 @@ hr: label_journal_diff: "Opis uspoređivanja" label_language: "Jezik" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Pređi na projekt..." label_keyword_plural: "Keywords" @@ -3477,9 +3550,6 @@ hr: label_project_hierarchy: "Hijerarhija projekta" label_project_mappings: "Projekti" label_project_new: "Novi projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekti" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3944,7 +4014,7 @@ hr: notice_not_authorized: "Niste autorizirani da pristupite ovoj stranici." notice_not_authorized_archived_project: "Projekt kojem pokušavate pristupiti je arhiviran." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4298,6 +4368,9 @@ hr: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4310,11 +4383,17 @@ hr: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentacija" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4499,7 +4578,7 @@ hr: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4605,7 +4684,7 @@ hr: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4773,6 +4852,7 @@ hr: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5271,3 +5351,8 @@ hr: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 663bd195bef..458d5f4d5a7 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -109,6 +109,23 @@ hu: explanation: text: "A felhasználó egyes műveletei (pl. egy munkacsomag kétszeri frissítése) egyetlen műveletté egyesülnek, ha korkülönbségük kisebb, mint a megadott időtartam. Ezek egyetlen műveletként jelennek meg az alkalmazásban. Ez ugyanannyi idővel késlelteti az értesítéseket, csökkenti az elküldött emailek számát, valamint befolyásolja a %{webhook_link} késleltetését is.\n" link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -590,6 +607,7 @@ hu: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Jelenleg nincs elérhető típus. form: @@ -604,6 +622,9 @@ hu: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -617,6 +638,7 @@ hu: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -712,9 +734,11 @@ hu: create_button: "Létrehoz" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Hozzáférési token helyreállítása sikertelen: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -724,6 +748,9 @@ hu: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "Az RSS-token törlésre került. Új token létrehozásához kérjük, használja az RSS szakaszban található linket." notice_ical_token_revoked: 'A "%{project_name}" projekt "%{calendar_name}" naptárához tartozó "%{token_name}" iCalendar token visszavonásra került. Az ezzel a tokennel rendelkező iCalendar URL mostantól érvénytelen.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Nincs megjeleníthető hír. @@ -1230,6 +1257,10 @@ hu: onthefly: "Automatikus felhasználó készítés" port: "Port szám" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Szerepkörök" notification: @@ -1488,6 +1519,7 @@ hu: even: "kell még." exclusion: "foglalt." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "túl nagy fájlméret (maximális méret %{count} Byte)." filter_does_not_exist: "szűrő nem létezik." format: "nem felel meg az elvárt '%{expected}' formátumnak." @@ -1510,7 +1542,8 @@ hu: not_a_datetime: "ez nem érvényes dátum." not_a_number: "ez nem egy szám." not_allowed: "hiányzó engedélyek miatt érvénytelen." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ez nem egy szám." not_an_iso_date: "nem érvényes dátum. A szükséges formátum ÉÉÉÉ-HH-NN." not_same_project: "nem azonos projekthez tartozik." @@ -1918,7 +1951,12 @@ hu: token/api: one: Hozzáférési token other: Hozzáférési token - type: "Típus" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Felhasználó" version: "Verzió" workflow: "Munkafolyamat" @@ -2135,6 +2173,7 @@ hu: button_click_to_reveal: "Kattints a felfedéshez" button_close: "Bezár" button_collapse_all: "Az összes bezárása" + button_confirm: "Confirm" button_configure: "Beállítások" button_continue: "Folytatás" button_complete: "Complete" @@ -2167,6 +2206,7 @@ hu: button_print: "Nyomtatás" button_quote: "Idéz" button_remove: Eltávolítás + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Átnevezés" button_replace: "Csere" @@ -2418,7 +2458,7 @@ hu: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2428,10 +2468,12 @@ hu: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2472,8 +2514,8 @@ hu: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2503,6 +2545,8 @@ hu: custom_actions: title: "Egyéni műveletek" description: "Az egyéni műveletek egy kattintással elérhető parancsikonok előre meghatározott műveletek csoportjához, amelyeket állapot, szerep, típus vagy projekt alapján elérhetővé tehet bizonyos munkacsomagokon." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2514,6 +2558,8 @@ hu: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Teszt felhasználók description: > @@ -2811,19 +2857,17 @@ hu: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Váltás Vállalati Verzióra" postgres_migration: "A rendszer költöztetése PostreSQL-re" @@ -2891,14 +2935,17 @@ hu: instructions_after_error: "Próbáljon meg újból bejelentkezni ide %{signin} kattintva. Ha a hiba továbbra is fennáll, kérje a rendszergazda segítséget." menus: admin: - mail_notification: "Email értesítés" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregálás" api_and_webhooks: "API és webhookok" + mail_notification: "Email értesítés" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Nincs megjeleníthető fiók" description: "Mindenki le lett tiltva. Újra engedélyezhetők az adminisztrációs menüben." @@ -2908,34 +2955,56 @@ hu: expiration: "Lejár" indefinite_expiration: "Soha" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Tárterületek" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2997,6 +3066,7 @@ hu: label_always_visible: "Mindig látható" label_announcement: "Hirdetmény" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API-hozzáférés kulcs" label_api_access_key_created_on: "APIhozzáférési kulcs készítette: %{value} ezelőtt" label_api_access_key_type: "API" @@ -3252,6 +3322,7 @@ hu: label_journal_diff: "Leírás összehasonlítás" label_language: "Nyelv" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Ugrás a projekthez" label_keyword_plural: "Kulcsszavak" @@ -3429,9 +3500,6 @@ hu: label_project_hierarchy: "Projekt-hierarchia" label_project_mappings: "Projektek" label_project_new: "Új projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projektek" label_project_list_plural: "Projekt listák" label_project_life_cycle: "Project life cycle" @@ -3894,7 +3962,7 @@ hu: notice_not_authorized: "Ön nem jogosult a lap eléréséhez." notice_not_authorized_archived_project: "Az elérni kivánt projekt archiválva." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "A jelszó nem megfelelő. Nem lehet folytatni." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "%{number} találat. \n Tab-al tudsz az első találatra fókuszálni." notice_principals_found_single: "Egyetlen találat van.\nA Tab billentyű megnyomásával ugrik rá a fókusz." notice_parent_item_not_found: "Parent item not found." @@ -4247,6 +4315,9 @@ hu: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4259,11 +4330,17 @@ hu: setting_apiv3_cors_origins_text_html: > Ha a CORS engedélyezve van, ezek azok az eredetiek, amelyek hozzáférhetnek az OpenProject API-hoz.
    Kérjük, olvassa el a Dokumentáció az Origin fejlécről című dokumentumot az elvárt értékek megadásáról. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API oldal méret" - setting_apiv3_max_page_instructions_html: > - Állítsa be azt a maximális oldalméretet, amellyel az API válaszolni fog. Nem lehet végrehajtani olyan API-kéréseket, amelyek több értéket adnak vissza egyetlen oldalon.
    Figyelem: Kérjük, csak akkor módosítsa ezt az értéket, ha biztos benne, hogy miért van szüksége rá. A magas érték beállítása jelentős hatást gyakorol a teljesítményre, míg az oldalankénti beállításoknál alacsonyabb érték hibákat okoz a lapozott nézetekben. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentáció" setting_apiv3_docs_enabled: "Dokumentumok oldal engedélyezése\n" setting_apiv3_docs_enabled_instructions_html: > @@ -4448,7 +4525,7 @@ hu: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Határozza meg a feltöltött fájlok érvényes fájlkiterjesztéseinek és/vagy mime típusainak listáját.
    Adjon meg fájlkiterjesztéseket (pl. %{ext_example} ) vagy mime típusokat (pl. %{mime_example} ).
    Hagyja üresen, ha bármilyen fájltípust szeretne feltölteni. Több érték megengedett (egy sor minden értékhez). @@ -4554,7 +4631,7 @@ hu: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4722,6 +4799,7 @@ hu: Megjegyzés: ha engedélyezve van, akkor a telepítési állapotot jelző jelvény jelenik meg a %{information_panel_label} adminisztrációs panelen és a kezdőlapon. Csak a rendszergazdák számára jelenik meg.
    A jelvény ellenőrzi az aktuális OpenProject verziót a hivatalos OpenProject kiadási adatbázishoz képest, hogy figyelmeztesse Önt minden frissítésre vagy ismert biztonsági résre. Ha többet szeretne megtudni arról, hogy mit tartalmaz az ellenőrzés, milyen adatokra van szükség az elérhető frissítésekhez, és hogyan tilthatja le ezt az ellenőrzést, keresse fel a konfigurációs dokumentációt . text_own_membership_delete_confirmation: "Értesítem arról, hogy eltávolít néhány vagy az összes jogosultságot, és ezt követően már nem lehet szerkeszteni ezt a projektet. Biztosan folytatni kívánja?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin eszközök könyvtára írható" text_powered_by: "Készítette %{link}" text_project_identifier_info: "Csak kisbetű (a-z), számok, kötőjelek és aláhúzásjelek van engedélyezve, és kisbetűvel kell kezdődnie." @@ -5218,3 +5296,8 @@ hu: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 4b9b2aea8af..d316441255a 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -109,6 +109,23 @@ id: explanation: text: "Setiap tindakan pengguna (mis. memperbarui paket kerja dua kali) digabungkan menjadi satu tindakan jika perbedaan usianya kurang dari rentang waktu yang ditentukan. Mereka akan ditampilkan sebagai tindakan tunggal dalam aplikasi. Ini juga akan menunda pemberitahuan dengan jumlah waktu yang sama sehingga mengurangi jumlah email yang dikirim dan juga akan memengaruhi penundaan %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -586,6 +603,7 @@ id: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -600,6 +618,9 @@ id: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -613,6 +634,7 @@ id: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -702,9 +724,11 @@ id: create_button: "Buat baru" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Gagal untuk menset ulang akses token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -714,6 +738,9 @@ id: notice_api_token_revoked: "Token API telah dihapus. Untuk membuat token baru, gunakan tombol di bagian API." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'Token iCalendar "%{token_name}" untuk kalender "%{calendar_name}" proyek "%{project_name}" telah dicabut. URL iCalendar dengan token ini sekarang tidak valid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1218,6 +1245,10 @@ id: onthefly: "Otomatis membuat pengguna" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1476,6 +1507,7 @@ id: even: "harus imbang." exclusion: "telah dipesan." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "ukuran maksimum yang diperbolehkan %{count} Bytes." filter_does_not_exist: "filter tidak ada." format: "tidak cocok dengan format yang diharapkan '%{expected}'." @@ -1498,7 +1530,8 @@ id: not_a_datetime: "bukan tanggal waktu yang valid." not_a_number: "harus diisi angka." not_allowed: "tidak valid karena tidak ada izin." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "harus bilangan bulat." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "harus berasal dari proyek yang sama." @@ -1893,7 +1926,10 @@ id: status: "Status Work Package" token/api: other: Token akses - type: "Tipe" + token/rss: + other: "RSS tokens" + type: + other: "Types" user: "User" version: "Versi" workflow: "Workflow" @@ -2106,6 +2142,7 @@ id: button_click_to_reveal: "Klik untuk mengungkapkan" button_close: "Tutup" button_collapse_all: "Tutup semua" + button_confirm: "Confirm" button_configure: "Konfigurasi" button_continue: "Lanjutkan" button_complete: "Complete" @@ -2138,6 +2175,7 @@ id: button_print: "Cetak" button_quote: "Kutipan" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Ubah nama" button_replace: "Ganti" @@ -2369,7 +2407,7 @@ id: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2379,10 +2417,12 @@ id: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2423,8 +2463,8 @@ id: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2454,6 +2494,8 @@ id: custom_actions: title: "Tindakan khusus" description: "Tindakan kustom adalah pintasan sekali klik ke serangkaian tindakan yang ditentukan sebelumnya yang dapat Anda sediakan pada paket kerja tertentu berdasarkan status, peran, jenis, atau proyek." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2465,6 +2507,8 @@ id: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Pengguna placeholder description: > @@ -2761,19 +2805,17 @@ id: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrasi instalasi anda ke PostgreSQL" @@ -2841,14 +2883,17 @@ id: instructions_after_error: "Anda dapat login lagi dengan mengklik %{signin}. Jika masih muncul error, tanyakan admin Anda untuk bantuan." menus: admin: - mail_notification: "Notifikasi email" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API dan webhook" + mail_notification: "Notifikasi email" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2858,34 +2903,56 @@ id: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Penyimpanan berkas" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2947,6 +3014,7 @@ id: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key dibuat %{value} yg lalu" label_api_access_key_type: "API" @@ -3202,6 +3270,7 @@ id: label_journal_diff: "Deskripsi perbandingan" label_language: "Bahasa" label_languages: "Bahasa" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Lompat ke Project..." label_keyword_plural: "Kata kunci" @@ -3379,9 +3448,6 @@ id: label_project_hierarchy: "Hirarki proyek" label_project_mappings: "Project" label_project_new: "Project baru" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Project" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3844,7 +3910,7 @@ id: notice_not_authorized: "Anda tidak diizinkan untuk mengakses halaman ini." notice_not_authorized_archived_project: "Project yang Anda coba akses telah diarsipkan." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Password Anda tidak tepat. Tidak dapat melanjutkan." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Ada beberapa %{number} hasil yang ditemukan. \n Tab untuk fokus ke hasil pertama." notice_principals_found_single: "Ada satu hasil.\n Tab untuk lebih fokus." notice_parent_item_not_found: "Parent item not found." @@ -4193,6 +4259,9 @@ id: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4205,11 +4274,17 @@ id: setting_apiv3_cors_origins_text_html: > Jika CORS diaktifkan, ini adalah asal yang diizinkan untuk mengakses OpenProject API.
    Harap periksa Dokumentasi pada header Asal tentang cara menentukan nilai yang diharapkan. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Ukuran halaman API maksimum" - setting_apiv3_max_page_instructions_html: > - Tetapkan ukuran halaman maksimum yang akan ditanggapi oleh API. Tidak mungkin melakukan permintaan API yang mengembalikan lebih banyak nilai pada satu halaman.
    Peringatan: Ubah nilai ini hanya jika Anda yakin mengapa Anda membutuhkannya. Menyetel ke nilai tinggi akan menghasilkan dampak kinerja yang signifikan, sedangkan nilai yang lebih rendah dari opsi per halaman akan menyebabkan kesalahan dalam tampilan paginasi. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentasi" setting_apiv3_docs_enabled: "Aktifkan halaman dokumen" setting_apiv3_docs_enabled_instructions_html: > @@ -4394,7 +4469,7 @@ id: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4500,7 +4575,7 @@ id: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4668,6 +4743,7 @@ id: Catatan: jika diaktifkan, ini akan menampilkan lencana dengan status pemasangan Anda di panel administrasi %{information_panel_label}, dan di beranda. Ini hanya ditampilkan kepada administrator.
    Lencana akan memeriksa versi OpenProject Anda saat ini dengan database rilis OpenProject resmi untuk memberi tahu Anda tentang pembaruan atau kerentanan yang diketahui. Untuk informasi lebih lanjut tentang apa yang diberikan pemeriksaan, data apa yang diperlukan untuk menyediakan pembaruan yang tersedia, dan cara menonaktifkan pemeriksaan ini, silakan kunjungi dokumentasi konfigurasi. text_own_membership_delete_confirmation: "Anda akan menghapus hak akses Anda dan mungkin Anda tidak dapat lagi mengedit Project ini. Apakah Anda yakin Anda ingin melanjutkan?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin aset direktori, bisa ditulisi" text_powered_by: "Didukung oleh %{link}" text_project_identifier_info: "Hanya huruf kecil (a-z), angka, garis dan garis bawah yang diperbolehkan, harus diawali dengan huruf kecil." @@ -5162,3 +5238,8 @@ id: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 5fd3fed14e8..18aed44a241 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -109,6 +109,23 @@ it: explanation: text: "Le singole azioni di un utente (es. l'aggiornamento di una macro-attività due volte) vengono aggregate in un'unica azione se il tempo intercorso tra esse è inferiore al periodo minimo di tempo impostato. Verranno visualizzate quindi come un'unica azione all'interno dell'applicazione. Questo ritarderà anche le notifiche della stessa quantità di tempo, riducendo così il numero di email inviate, e influirà anche sul ritardo di %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "Il protocollo di contesto del modello consente agli agenti di intelligenza artificiale di fornire ai propri utenti strumenti e risorse esposti da questa istanza di OpenProject." + resources_heading: "Risorse" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Aggiorna risorse" + tools_heading: "Strumenti" + tools_description: "OpenProject implementa i seguenti strumenti. Ognuno di essi può essere abilitato, rinominato e descritto a piacere. Per ulteriori informazioni, consultare la [documentazione sugli strumenti MCP](docs_url)." + tools_submit: "Aggiorna strumenti" + multi_update: + success: "Configurazioni MCP aggiornate con successo." + server_form: + description_caption: "Come verrà descritto il server MCP alle altre applicazioni che vi si collegheranno." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "La configurazione MCP non può essere aggiornata." + success: "La configurazione MCP è stata aggiornata correttamente." scim_clients: authentication_methods: sso: "JWT dal fornitore di identità" @@ -589,6 +606,7 @@ it: is_for_all_blank_slate: heading: Per tutti i progetti description: Questo attributo di progetto è attivato in tutti i progetti, poiché l'opzione "Per tutti i progetti" è selezionata. Non può essere disattivato per i singoli progetti. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Al momento non sono disponibili tipi. form: @@ -603,6 +621,9 @@ it: work_package_priorities: new_label: "Nuova priorità" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "L'artefatto generato verrà salvato come allegato PDF alla macro-attività dell'artefatto." description_file_link_export: "La macro-attività dell'artefatto includerà un collegamento a un file PDF archiviato in uno spazio di archiviazione esterno. Richiede uno spazio di archiviazione file funzionante con cartelle di progetto gestite automaticamente per questo progetto. Al momento sono supportati solo archivi file Nextcloud." @@ -616,6 +637,7 @@ it: label_request_submission: "Richiesta di invio" project_attributes_description: > Seleziona quali attributi di progetto includere nella richiesta di avvio del progetto. Questo elenco include solo gli [attributi di progetto](project_attributes_url) abilitati per questo progetto. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Modifica lo stato wizard: @@ -711,9 +733,11 @@ it: create_button: "Crea" name_label: "Nome del token" created_dialog: + one_time_warning: "Questa è l'unica volta in cui vedrai questo token. Assicurati di copiarlo adesso." token/api: title: "Il token API è stato generato" - warning: "Questa è l'unica volta in cui vedrai questo token. Assicurati di copiarlo adesso." + token/rss: + title: "Il token RSS è stato generato" failed_to_reset_token: "Impossibile reimpostare il token di accesso: %{error}" failed_to_create_token: "Creazione del token di accesso non riuscita: %{error}" failed_to_revoke_token: "Revoca del token di accesso non riuscita: %{error}" @@ -723,6 +747,9 @@ it: notice_api_token_revoked: "Il token API è stato eliminato. Per creare un nuovo token utilizza il pulsante nella sezione API." notice_rss_token_revoked: "Il token RSS è stato eliminato. Per creare un nuovo token utilizza il link nella sezione RSS." notice_ical_token_revoked: 'Il token di iCalendar "%{token_name}" per il calendario "%{calendar_name}" del progetto "%{project_name}" è stato revocato. L''URL di iCalendar con questo token non è ora valido.' + password_confirmation_dialog: + confirmation_required: "È necessario inserire la password dell'account per confermare la modifica." + title: "Conferma la password per continuare" news: index: no_results_title_text: Al momento non c'è nessuna notizia da segnalare. @@ -1228,6 +1255,10 @@ it: onthefly: "Creazione automatica degli utenti" port: "Porta" tls_certificate_string: "Certificato SSL del server LDAP" + mcp_configuration: + enabled: Attivata + title: Titolo + description: Descrizione member: roles: "Ruoli" notification: @@ -1486,6 +1517,7 @@ it: even: "deve essere pari." exclusion: "è riservato." feature_disabled: non disponibile. + feature_disabled_for_project: non attivo per questo progetto. file_too_large: "è troppo grande (la dimensione massima è %{count} Byte)." filter_does_not_exist: "il filtro non esiste" format: "non corrisponde al formato previsto '%{expected}'." @@ -1508,7 +1540,8 @@ it: not_a_datetime: "non è un'orario valido." not_a_number: "non è un numero." not_allowed: "non è valido a causa di autorizzazioni assenti." - not_json: "non è un oggetto JSON valido." + not_json: "non è analizzabile come JSON." + not_json_object: "non è un oggetto JSON." not_an_integer: "non è un numero intero." not_an_iso_date: "non è una data valida. Formato richiesto: AAAA-MM-GG." not_same_project: "non appartiene allo stesso progetto." @@ -1916,7 +1949,12 @@ it: token/api: one: Token di accesso other: Token di accesso - type: "Tipo" + token/rss: + one: "Token RSS" + other: "Token RSS" + type: + one: "Tipo" + other: "Tipi" user: "Utente" version: "Versione" workflow: "Flusso di lavoro" @@ -2133,6 +2171,7 @@ it: button_click_to_reveal: "Clicca per mostrare" button_close: "Chiudi" button_collapse_all: "Comprimi Tutto" + button_confirm: "Conferma" button_configure: "Configura" button_continue: "Continua" button_complete: "Completa" @@ -2165,6 +2204,7 @@ it: button_print: "Stampa" button_quote: "Cita" button_remove: Rimuovi + button_remove_permanently: "Rimuovi permanentemente" button_remove_reminder: "Rimuovi promemoria" button_rename: "Rinomina" button_replace: "Sostituisci" @@ -2416,7 +2456,7 @@ it: baseline_comparison: Confronti della base di riferimento board_view: Schede avanzate calculated_values: Valori calcolati - conditional_highlighting: Evidenziazione condizionale + capture_external_links: Intercetta link esterni internal_comments: Commenti interni custom_actions: Azioni personalizzate custom_field_hierarchies: Gerarchie @@ -2426,10 +2466,12 @@ it: edit_attribute_groups: Modifica proprietà gruppo gantt_pdf_export: Esportazione PDF Gantt ldap_groups: Utenti LDAP e sincronizzazione di gruppo + mcp_server: Server MCP nextcloud_sso: Accesso singolo per Nextcloud Storage one_drive_sharepoint_file_storage: Archiviazione file OneDrive/SharePoint placeholder_users: Utenti segnaposto portfolio_management: Gestione del portfolio + project_creation_wizard: Richiesta di avvio del progetto project_list_sharing: Condivisione elenco progetti readonly_work_packages: Macro-attività di sola lettura scim_api: API server SCIM @@ -2470,8 +2512,8 @@ it: description: "Crea oggetti generati automaticamente utilizzando gli attributi e il testo di riferimento." customize_life_cycle: description: "Crea e organizza fasi di progetto diverse da quelle forniti dalla pianificazione del ciclo di progetto PM2." - conditional_highlighting: - description: "Hai bisogno di alcune macro-attività per distinguerti dalla massa? Usa l'evidenziazione condizionale nella tabella delle macro-attività." + capture_external_links: + description: "Previeni gli attacchi di ingegneria sociale intercettando e avvisando gli utenti dei link esterni prima che li visitino." work_package_query_relation_columns: description: "Vuoi visualizzare le relazioni o gli elementi figlio nell'elenco di macro-attività?" edit_attribute_groups: @@ -2501,6 +2543,8 @@ it: custom_actions: title: "Azioni personalizzate" description: "Le azioni personalizzate sono scorciatoie che con un clic ti consentono di eseguire una serie di azioni predefinite che è possibile rendere disponibili su determinate macro-attività in base a stato, ruolo, tipo o progetto." + mcp_server: + description: "Integra gli agenti IA con l'istanza OpenProject tramite MCP." nextcloud_sso: title: "Single Sign-On per Nextcloud Storage" description: "Abilita un'autenticazione veloce e sicura per il tuo archivio Nextcloud con Single Sign-On. Semplifica la gestione degli accessi e migliora la praticità per l'utente." @@ -2512,6 +2556,8 @@ it: description: "Consenti agli utenti di accedere tramite provider SSO esterni utilizzando SAML o OpenID Connect, per un accesso fluido e un'integrazione con i sistemi di identità esistenti." virus_scanning: description: "Assicurati che i file caricati in OpenProject vengano scansionati alla ricerca di virus prima di renderli accessibili ad altri utenti." + project_creation_wizard: + description: "Genera una procedura guidata passo dopo passo per aiutare i project manager a compilare una richiesta di avvio del progetto." placeholder_users: title: Utenti segnaposto description: > @@ -2809,19 +2855,17 @@ it: learn_about: "Scopri di più su tutte le nuove funzionalità" missing: "Non ci sono ancora caratteristiche evidenziate." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > Questa versione contiene diverse nuove funzionalità e miglioramenti, come ad esempio: new_features_list: - line_0: Collaborazione in tempo reale sui documenti. - line_1: Capacità di strutturare i progetti correlati in programmi e portfolio per focalizzarli su obiettivi strategici (componente aggiuntivo Enterprise). - line_2: Migliore gestione delle riunioni con modalità bozza, modalità di presentazione, risultati migliorati e iscrizione iCal. - line_3: Integrazione SharePoint aggiornata con autorizzazioni più restrittive (componente aggiuntivo Enterprise). - line_4: Panoramica del progetto ridisegnata con nuove schede, widget configurabili e un layout migliorato. - line_5: Opzione per tutelare in modo più rigoroso la privacy degli utenti che non lavorano nello stesso progetto. - line_6: Flusso di creazione dei progetti migliorato con una selezione dei modelli più efficace. - line_7: Ricerca globale più intelligente che include tipo e stato, migliorando la precisione in diversi completamenti automatici. - line_8: Miglioramenti di accessibilità con testi ALT e colori grafici migliorati. + line_0: Avvio automatico del progetto (componente aggiuntivo Enterprise). + line_1: "Riunioni: aggiungi macro-attività nuove o esistenti come risultati." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Riunioni ricorrenti: duplica i punti dell'ordine del giorno della prossima ricorrenza." + line_4: "Rilascio alla community: evidenziazione degli attributi." + line_5: Avviso prima dell'apertura di link esterni nei contenuti forniti dall'utente (componente aggiuntivo Enterprise). + line_6: Prestazioni ed esperienza utente migliorate, compresa la scheda Attività e il modulo Documenti. links: upgrade_enterprise_edition: "Aggiorna ad Enterprise edition" postgres_migration: "Migrazione dell'installazione su PostgreSQL" @@ -2889,14 +2933,17 @@ it: instructions_after_error: "Si può provare ad accedere nuovamente cliccando %{signin}. Se l'errore persiste, chiedi aiuto al tuo amministratore." menus: admin: - mail_notification: "Notifiche email" - mails_and_notifications: "Email e notifiche" + ai: "Intelligenza artificiale (IA)" aggregation: "Aggregazione" api_and_webhooks: "API e webhooks" + mail_notification: "Notifiche email" + mails_and_notifications: "Email e notifiche" + mcp_configurations: "Modello di protocollo contestuale (MCP - Model Context Protocol)" quick_add: label: "Aggiungi…" my_account: access_tokens: + description: "I token provider vengono emessi da OpenProject, consentendo ad altre applicazioni di accedervi. I token client vengono emessi da altre applicazioni, consentendo a OpenProject di accedervi." no_results: title: "Nessun token di accesso da visualizzare" description: "Sono stati tutti disabilitati. Possono essere nuovamente abilitati dal menu amministrazione." @@ -2906,34 +2953,56 @@ it: expiration: "Scade" indefinite_expiration: "Mai" simple_revoke_confirmation: "Revocare il token?" + tabs: + client: + title: "Token client" + provider: + title: "Token provider" token/api: + blank_description: "Non esiste ancora un token API. Puoi crearne uno utilizzando il pulsante qui sotto." + blank_title: "Nessun token API" title: "API" + table_title: "Token API" text_hint: "I token API consentono alle applicazioni di terze parti di comunicare con questa istanza OpenProject tramite le API REST." + static_token_name: "Token API" disabled_text: "I token API non sono abilitati dall'amministratore. Contatta il tuo amministratore per utilizzare questa funzione." add_button: "Token API" - api: - static_token_name: "Token API" ical: + blank_description: "Per aggiungere un token iCalendar, iscriviti a un calendario nuovo o esistente dall'interno del modulo Calendario di un progetto. È necessario disporre delle autorizzazioni necessarie." + blank_title: "Nessun token iCalendar" title: "iCalendar" + table_title: "Token iCalendar" text_hint_link: "I token iCalendar consentono agli utenti di [iscriversi ai calendari di OpenProject](docs_url) e visualizzare informazioni aggiornate sulle macro-attività da client esterni." disabled_text: "Le iscrizioni iCalendar non sono abilitate dall'amministratore. Contatta il tuo amministratore per utilizzare questa funzione." - empty_text_hint: "Per aggiungere un token iCalendar, iscriviti a un calendario nuovo o esistente dall'interno del modulo Calendario di un progetto. È necessario disporre delle autorizzazioni necessarie." - oauth: + oauth_application: + active_tokens: "Token attivi" + blank_description: "Non è configurato e attivo alcun accesso ad applicazioni di terze parti per te." + blank_title: "Nessun token di applicazione OAuth" + last_used_at: "Ultimo utilizzo:" title: "OAuth" - text_hint: "I token OAuth consentono alle applicazioni di terze parti di connettersi con questa istanza OpenProject." - empty_text_hint: "Nessun accesso ad applicazioni di terze parti è configurato e attivo per te. Contatta il tuo amministratore per attivare questa funzione." - rss: + table_title: "Token di applicazione OAuth" + text_hint: "I token di applicazione OAuth consentono alle applicazioni di terze parti di connettersi con questa istanza OpenProject." + oauth_client: + blank_description: "Non ci sono ancora token client OAuth." + blank_title: "Nessun token client OAuth" + failed: "Si è verificato un errore e non è stato possibile rimuovere il token. Riprova più tardi." + integration_type: "Tipo di integrazione" + table_title: "Token client OAuth" + text_hint: "I token client OAuth consentono a questa istanza di OpenProject di connettersi con applicazioni esterne, come gli archivi di file." + title: "OAuth" + remove_token: "Vuoi davvero rimuovere questo token? Dovrai effettuare nuovamente l'accesso su %{integration}." + removed: "Il token del cliente OAuth è stato rimosso con successo" + unknown_integration: "Sconosciuto" + token/rss: + add_button: "Token RSS" + blank_description: "Non esiste ancora un token RSS. Puoi crearne uno utilizzando il pulsante qui sotto." + blank_title: "Nessun token RSS" title: "RSS" + table_title: "Token RSS" text_hint: "I token RSS consentono agli utenti di tenere il passo con le ultime modifiche in questa istanza di OpenProject tramite un lettore RSS esterno." static_token_name: "Token RSS" disabled_text: "I token RSS non sono abilitati dall'amministratore. Contatta il tuo amministratore per utilizzare questa funzione." storages: - title: "Archivi file" - text_hint: "I token di archiviazione dei file connettono questa istanza OpenProject con un sistema di archiviazione file esterno." - empty_text_hint: "Non esiste alcun accesso allo spazio di archiviazione collegato al tuo account." - revoke_token: "Vuoi davvero rimuovere questo token? Dovrai effettuare nuovamente l'accesso su %{storage}" - removed: "Token di archiviazione file rimosso correttamente" - failed: "Si è verificato un errore e non è stato possibile rimuovere il token. Riprova più tardi." unknown_storage: "Archivio sconosciuto" notifications: reasons: @@ -2995,6 +3064,7 @@ it: label_always_visible: "Sempre visibile" label_announcement: "Annuncio" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Chiave di accesso API" label_api_access_key_created_on: "Chiave di accesso API creata %{value} fa" label_api_access_key_type: "API" @@ -3250,6 +3320,7 @@ it: label_journal_diff: "Confronto Descrizione" label_language: "Lingua" label_languages: "Lingue" + label_external_links: "Link esterni" label_locale: "Lingua e paese" label_jump_to_a_project: "Salta ad altro progetto..." label_keyword_plural: "Parole chiave" @@ -3427,9 +3498,6 @@ it: label_project_hierarchy: "Gerarchia del progetto" label_project_mappings: "Progetti" label_project_new: "Nuovo progetto" - label_project_initiation_request: "Nuova richiesta di avvio del progetto" - label_project_creation_wizard: "Creazione guidata nuovo progetto" - label_project_mandate: "Nuovo mandato di progetto" label_project_plural: "Progetti" label_project_list_plural: "Elenchi progetto" label_project_life_cycle: "Ciclo di vita del progetto" @@ -3893,7 +3961,7 @@ it: notice_not_authorized: "Non sei autorizzato ad accedere a questa pagina." notice_not_authorized_archived_project: "Il progetto che stai tentando di accedere è stato archiviato." notice_requires_enterprise_token: "Il token Enterprise è assente o non consente l'accesso a questa pagina." - notice_password_confirmation_failed: "La password non è corretta. Impossibile continuare." + notice_password_confirmation_failed: "La password inserita non è corretta." notice_principals_found_multiple: "Trovati %{number} risultati. \n Premi Tab per evidenziare il primo." notice_principals_found_single: "Trovato un solo risultato. \n Premi Tab per evidenziarlo." notice_parent_item_not_found: "L'elemento genitore non è stato trovato." @@ -4246,6 +4314,9 @@ it: setting_allowed_link_protocols: "Protocolli di collegamento consentiti" setting_allowed_link_protocols_text_html: >- Consenti che questi protocolli vengano visualizzati come link nelle descrizioni delle macro-attività, nei campi di testo lunghi e nei commenti. Ad esempio, %{tel_code} o %{element_code}. Inserisci un protocollo per riga.
    I protocolli %{http_code}, %{https_code} e %{mailto_code} sono sempre consentiti. + setting_capture_external_links: "Intercetta link esterni" + setting_capture_external_links_text: > + Se l'opzione è abilitata, tutti i link esterni in testo formattato verranno reindirizzati a una pagina di avviso prima di uscire dall'applicazione. Questo aiuta a proteggere gli utenti da siti web esterni potenzialmente dannosi. setting_after_first_login_redirect_url: "Reindirizzamento di primo accesso" setting_after_first_login_redirect_url_text_html: > Imposta un percorso per reindirizzare gli utenti dopo il loro primo accesso. Se vuoto, reindirizza alla home page per il tour di onboarding.
    Esempio: /my/page @@ -4258,11 +4329,17 @@ it: setting_apiv3_cors_origins_text_html: > Se CORS è abilitato, queste sono le origini che possono accedere alle API di OpenProject.
    Controlla la Documentazione sull'intestazione dell'origine per sapere come specificare i valori previsti. setting_apiv3_write_readonly_attributes: "Accesso in scrittura agli attributi di sola lettura" - setting_apiv3_write_readonly_attributes_instructions_html: > - Se abilitata, l'API consentirà agli amministratori di scrivere attributi statici di sola lettura durante la creazione, come createdAt e author.
    Attenzione: Questa impostazione può servire per esempio per l'importazione di dati, ma consente agli amministratori di impersonare la creazione di articoli come altri utenti. Tutte le richieste di creazione vengono comunque registrate con il vero autore.
    Per maggiori informazioni sugli attributi e sulle risorse supportate, consulta il sito %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Se l'opzione è abilitata, l'API consentirà agli amministratori di scrivere attributi statici di sola lettura durante la creazione, come createdAt e author. + setting_apiv3_write_readonly_attributes_warning: > + Questa impostazione è utile, ad esempio, per l'importazione di dati, ma consente agli amministratori di impersonare altri utenti nella creazione di elementi. Tutte le richieste di creazione vengono comunque registrate con il vero autore. + setting_apiv3_write_readonly_attributes_additional: > + Per maggiori informazioni sugli attributi e sulle risorse supportate, consulta %{api_documentation_link}. setting_apiv3_max_page_size: "Dimensione massima della pagina API" - setting_apiv3_max_page_instructions_html: > - Imposta la dimensione massima della pagina con cui l'API risponderà. Non sarà possibile eseguire richieste API che restituiscono più valori su una singola pagina.
    Attenzione: Si prega di modificare questo valore solo se sei sicuro del motivo per cui ne hai bisogno. La definizione di un valore elevato comporterà un impatto significativo sulle prestazioni, mentre un valore inferiore alle opzioni per pagina causerà errori nelle viste paginate. + setting_apiv3_max_page_size_instructions: > + Imposta la dimensione massima della pagina con cui l'API risponderà. Non sarà possibile eseguire richieste API che restituiscano più valori in una singola pagina. + setting_apiv3_max_page_size_warning: > + Modifica questo valore solo se hai certezza del motivo per cui ti serve. Un valore elevato avrà un impatto significativo sulle prestazioni, mentre un valore inferiore alle opzioni per pagina causerà errori nelle visualizzazioni paginate. setting_apiv3_docs: "Documentazione" setting_apiv3_docs_enabled: "Abilita pagina di documenti" setting_apiv3_docs_enabled_instructions_html: > @@ -4447,7 +4524,7 @@ it: omniauth_direct_login_hint_html: > Se questa opzione è attiva, le richieste di accesso saranno reindirizzate al fornitore omniauth configurato. Il menu a tendina di accesso e la pagina di accesso saranno disabilitate.
    Nota: a meno che non si disabiliti anche l'accesso con password, con questa opzione abilitata, gli utenti possono ancora accedere internamente visitando la pagina di accesso %{internal_path}. remapping_existing_users_hint: > - Se abilitata, consente a qualsiasi provider di identità configurato di far accedere gli utenti esistenti in base al loro indirizzo e-mail, anche se l'utente non ha mai effettuato l'accesso tramite quel provider in precedenza. Questo può essere utile durante la migrazione dell'istanza OpenProject a un nuovo provider SSO, ma non è raccomandato quando si utilizza un provider non considerato affidabile da tutti gli utenti dell'istanza. + Se abilitata, consente a qualsiasi provider di identità configurato di far accedere gli utenti esistenti in base al loro nome utente, anche se l'utente non ha mai effettuato l'accesso tramite quel provider in precedenza. Questo può essere utile durante la migrazione dell'istanza OpenProject a un nuovo provider SSO, ma non è raccomandato quando si utilizza un provider non considerato affidabile da tutti gli utenti dell'istanza. attachments: whitelist_text_html: > Definisci un elenco di estensioni di file valide e/o tipi MIME per i file caricati.
    Inserisci le estensioni dei file (ad es. %{ext_example}) o i tipi MIME (ad es. %{mime_example}).
    Lascia vuoto per consentire il caricamento di qualsiasi tipo di file. Sono consentiti più valori (una riga per ogni valore). @@ -4721,6 +4798,7 @@ it: Nota: se abilitata questa opzione visualizzerà un badge con lo stato dell'installazione nel pannello di amministrazione di %{information_panel_label} e sulla home page. Verrà visualizzata solo agli amministratori.
    il badge controllerà la tua attuale versione di OpenProject con l'ultima versione rilasciata per avvisarti di eventuali aggiornamenti o risoluzioni di vulnerabilità note. Per ulteriori informazioni sulle funzionalità offerte dal controllo, su quali dati è necessario fornire per ottenere gli aggiornamenti disponibili e su come disabilitare questo controllo, visita la documentazione sulla configurazione. text_own_membership_delete_confirmation: "Stai per rimuovere qualcuno o tutti i tuoi permessi e potresti non essere più in grado di modificare questo progetto dopo questo passo.\nSei sicuro di voler continuare?" text_permanent_delete_confirmation_checkbox_label: "Sono consapevole che questa cancellazione non può essere annullata" + text_permanent_remove_confirmation_checkbox_label: "Sono consapevole che questa rimozione non può essere annullata" text_plugin_assets_writable: "Cartella del pool di plugin installati scrivibile" text_powered_by: "Offerto da %{link}" text_project_identifier_info: "Solo le lettere minuscole (a-z), numeri, trattini e trattini bassi sono consentiti, devi iniziare con una lettera maiuscola." @@ -4811,8 +4889,8 @@ it: other: "bloccato temporaneamente (%{count} tentativi di accesso falliti)" confirm_status_change: "Stai per modificare lo stato di '%{name}'. Continuare?" deleted: "Utente cancellato" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Non puoi cambiare il tuo stato utente." + error_admin_change_on_non_admin: "Solo gli amministratori possono modificare lo stato degli utenti amministratori." error_status_change_failed: "Il cambiamento dello stato dell'utente è fallito a causa dei seguenti errori: %{errors}" invite: Invita l'utente via e-mail invited: invitato @@ -5217,3 +5295,8 @@ it: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Uscita da OpenProject" + warning_message: "Stai per uscire da OpenProject e visitare un sito web esterno. Tieni presente che i siti web esterni non sono sotto il nostro controllo e potrebbero avere politiche sulla privacy e sulla sicurezza diverse." + continue_message: "Vuoi davvero procedere al seguente link esterno?" + continue_button: "Prosegui con il sito web esterno" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index e0fcca54b30..ef4bbbeadb5 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -109,6 +109,23 @@ ja: explanation: text: "ユーザーの個々のアクション(例えば、ワークパッケージを2回更新する)は、それらの年齢差が指定されたタイムスパン未満である場合、単一のアクションに集約されます。これらはアプリケーション内で1つのアクションとして表示されます。これはまた、送信されるメールの数を減らし、 %{webhook_link} の遅延にも影響します。" link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "IDプロバイダーからのJWT" @@ -304,7 +321,7 @@ ja: delete_dialog: title: "カスタムフィールド項目の削除" heading: "カスタムフィールド項目を削除しますか?" - description: "このアクションはアイテムとそのすべてのサブアイテムを不可逆的に削除します。割り当てられた値は完全に削除されます。 この項目が必要な場合、項目を削除すると既存の作業パッケージが無効になる可能性があります。" + description: "このアクションはアイテムとそのすべてのサブアイテムを不可逆的に削除します。割り当てられた値は完全に削除されます。 この項目が必要な場合、項目を削除すると既存のワークパッケージが無効になる可能性があります。" placeholder: label: "アイテムラベル" short: "ショートネーム" @@ -588,6 +605,7 @@ ja: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: 現在、有効な種類はありません。 form: @@ -602,6 +620,9 @@ ja: work_package_priorities: new_label: "新しい優先度" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -615,6 +636,7 @@ ja: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -704,9 +726,11 @@ ja: create_button: "作成" name_label: "トークン名" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "API トークンが生成されました" - warning: "このトークンが表示される唯一の時間です。今すぐコピーしてください。" + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "アクセストークンをリセットできませんでした: %{error}" failed_to_create_token: "アクセストークンの作成に失敗しました: %{error}" failed_to_revoke_token: "アクセストークンの取り消しに失敗しました: %{error}" @@ -716,6 +740,9 @@ ja: notice_api_token_revoked: "APIトークンが削除されました。新しいトークンを作成するには、APIセクションの作成ボタンを使用してください。" notice_rss_token_revoked: "RSSトークンが削除されました。新しいトークンを作成するには、RSSセクションのリンクを使用してください。" notice_ical_token_revoked: 'プロジェクト "%{project_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{token_name}" が失効しました。このトークンを持つiCalendar URLは無効になりました。' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: 現在、報告するニュースはありません。 @@ -954,7 +981,7 @@ ja: manually_scheduled: "手動でスケジュールされました。日付はリレーションの影響を受けません。" blankslate: title: "前任者なし" - description: "自動スケジューリングを有効にするには、この作業パッケージには少なくとも1つの前任者が必要です。 その後、最も近い前任者の後に自動的に開始するようにスケジュールされます。" + description: "自動スケジューリングを有効にするには、このワークパッケージには少なくとも1つの前任者が必要です。 その後、最も近い前任者の後に自動的に開始するようにスケジュールされます。" ignore_non_working_days: title: "営業日のみ" mode: @@ -985,7 +1012,7 @@ ja: copy_failed: "ワークパッケージをコピーできませんでした。" move_failed: "ワークパッケージを移動できませんでした。" could_not_be_saved: "次のワークパッケージを保存できませんでした:" - none_could_be_saved: "%{total} 作業パッケージのどれも更新できませんでした。" + none_could_be_saved: "%{total} ワークパッケージのどれも更新できませんでした。" x_out_of_y_could_be_saved: "%{failing} の %{total} ワークパッケージのうち、 %{success} を更新できませんでした。" selected_because_descendants: "%{selected} のワークパッケージが選択されたが、合計 %{total} のワークパッケージが影響を受け、その中には子孫も含まれる。" descendant: "選択された子孫" @@ -1220,6 +1247,10 @@ ja: onthefly: "ユーザーの自動作成" port: "ポート番号" tls_certificate_string: "LDAP サーバ SSL 証明書" + mcp_configuration: + enabled: Enabled + title: Title + description: 説明 member: roles: "ロール" notification: @@ -1244,7 +1275,7 @@ ja: false: "非公開" queries: "クエリ" status_code: "Status" - status_explanation: "Status description" + status_explanation: "ステータスの詳細" status_codes: not_started: "未着手" on_track: "順調" @@ -1333,7 +1364,7 @@ ja: is_closed: "作業が完了" is_readonly: "読み取り専用のワークパッケージ" excluded_from_totals: "階層内の合計の計算から除外" - default_done_ratio: "完成(%)" + default_done_ratio: "進捗度(%)" token/named: token_name: "トークン名" token/ical: @@ -1415,14 +1446,14 @@ ja: redirect_existing_links: "既存のリンクをリダイレクトする" text: "ページの内容" work_package: - ancestor: "と子・孫関係" #used for filtering of work packages that are descendants of a given work package + ancestor: "子・孫関係" #used for filtering of work packages that are descendants of a given work package begin_insertion: "挿入の始まり" begin_deletion: "削除の始まり" children: "サブ要素" derived_done_ratio: "完了率" - derived_remaining_hours: "残りの作業" - derived_remaining_time: "残りの作業" - done_ratio: "完成(%)" + derived_remaining_hours: "残時間" + derived_remaining_time: "残時間" + done_ratio: "進捗度(%)" duration: "期間" end_insertion: "挿入の終わり" end_deletion: "削除の終わり" @@ -1437,10 +1468,10 @@ ja: parent_issue: "親項目" parent_work_package: "親項目" priority: "優先度" - progress: "完成(%)" + progress: "進捗度(%)" readonly: "読み取り専用" - remaining_hours: "残りの作業" - remaining_time: "残りの作業" + remaining_hours: "残時間" + remaining_time: "残時間" shared_with_users: "共有先" schedule_manually: "手動スケジュール" spent_hours: "作業時間の記録" @@ -1478,6 +1509,7 @@ ja: even: "は偶数にしてください。" exclusion: "は予約されています。" feature_disabled: は利用できません。 + feature_disabled_for_project: is disabled for this project. file_too_large: "は大きすぎます (最大サイズは%{count}バイト)" filter_does_not_exist: "フィルターが存在しません。" format: "期待されるフォーマットの「%{expected}」と一致しません。" @@ -1500,7 +1532,8 @@ ja: not_a_datetime: "は有効な日時ではありません。" not_a_number: "は数値にしてください。" not_allowed: "権限がないため無効です。" - not_json: "は有効な JSON オブジェクトではありません。" + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "は整数にしてください。" not_an_iso_date: "は有効な日付ではありません。必要な形式: YYYY-MM-dd。" not_same_project: "は同じプロジェクトに属していません。" @@ -1757,10 +1790,10 @@ ja: assigned_to: format: "%{message}" done_ratio: - does_not_match_work_and_remaining_work: "仕事と残りの仕事が一致しません" + does_not_match_work_and_remaining_work: "予定時間と残時間が一致しません" cannot_be_set_when_work_is_zero: "作業時間が 0 の場合は設定できません" - must_be_set_when_remaining_work_is_set: "Remaining workが設定されている場合は必要。" - must_be_set_when_work_and_remaining_work_are_set: "作業と残りの作業が設定されている場合に必要です。" + must_be_set_when_remaining_work_is_set: "残時間が設定されている場合は必要。" + must_be_set_when_work_and_remaining_work_are_set: "作業と残時間が設定されている場合に必要です。" inclusion: "は0から100の間でなければなりません。" due_date: not_start_date: "は開始日になっていません。これはマイルストーンの場倍、必要である。" @@ -1793,16 +1826,16 @@ ja: does_not_exist: "指定されたカテゴリは存在しません。" estimated_hours: not_a_number: "は有効な日付ではありません。" - cant_be_inferior_to_remaining_work: "残りの作業よりも低くすることはできません。" - must_be_set_when_remaining_work_and_percent_complete_are_set: "残りの作業と % 完了が設定されている場合に必要です。" + cant_be_inferior_to_remaining_work: "残時間よりも低くすることはできません。" + must_be_set_when_remaining_work_and_percent_complete_are_set: "残時間と % 完了が設定されている場合に必要です。" remaining_hours: not_a_number: "は有効な日時ではありません。" - cant_exceed_work: "仕事より高くすることはできません。" + cant_exceed_work: "予定時間より高くすることはできません。" must_be_set_when_work_is_set: "作業が設定されている場合に必要です。" must_be_set_when_work_and_percent_complete_are_set: "「作業」と「完了率」が設定されている場合に必要です。" must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- must be 0h when Work is set and % Complete is 100%.' must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- - 「Work」が空で「% Complete」が100%の場合、必ず空でなければなりません。 + 「予定時間」が空で「% Complete」が100%の場合、必ず空でなければなりません。 readonly_status: "ワークパッケージは読み取り専用の状態になっているため、その属性は変更できません。" type: attributes: @@ -1895,7 +1928,10 @@ ja: status: "ステータス名" token/api: other: アクセストークン - type: "タイプ" + token/rss: + other: "RSS tokens" + type: + other: "Types" user: "ユーザ" version: "バージョン" workflow: "ワークフロー" @@ -1991,8 +2027,8 @@ ja: display_sums: "合計を表示" domain: "ドメイン" due_date: "終了日" - estimated_hours: "仕事" - estimated_time: "仕事" + estimated_hours: "予定時間" + estimated_time: "予定時間" email: "電子メールアドレス" entity_type: "エンティティ" expires_at: "有効期限" @@ -2038,7 +2074,7 @@ ja: state: "状態" subject: "タイトル" slug: "スラグ" - summary: "サマリ" + summary: "サマリー(概要)" template: "Template" time_zone: "タイムゾーン" text: "テキスト(本文)" @@ -2108,6 +2144,7 @@ ja: button_click_to_reveal: "明らかにするためにクリック" button_close: "閉じる" button_collapse_all: "全てを折りたたむ" + button_confirm: "Confirm" button_configure: "設定" button_continue: "続行" button_complete: "Complete" @@ -2140,6 +2177,7 @@ ja: button_print: "印刷" button_quote: "引用" button_remove: 削除 + button_remove_permanently: "Remove permanently" button_remove_reminder: "リマインダーを削除" button_rename: "名称変更" button_replace: "置き換え" @@ -2214,7 +2252,7 @@ ja: create_project: attributes_heading: "Fill in this mandatory information to work on your projects." template_label: "テンプレートを使用" - template_heading: "Select a project template to work with the most common project management methods, or create a project from scratch." + template_heading: "テンプレートを選択するか、ゼロからプロジェクトを作成。" copy_options: dependencies_label: "テンプレートからコピー" blank_template: @@ -2371,7 +2409,7 @@ ja: baseline_comparison: ベースラインの比較 board_view: 高度なボード calculated_values: Calculated values - conditional_highlighting: 条件付きハイライト + capture_external_links: Capture External Links internal_comments: 内部コメント custom_actions: カスタムアクション custom_field_hierarchies: Hierarchies @@ -2381,10 +2419,12 @@ ja: edit_attribute_groups: 属性グループを編集 gantt_pdf_export: ガントPDFをエクスポート ldap_groups: LDAP ユーザーとグループ同期 + mcp_server: MCP Server nextcloud_sso: Nextcloudストレージのシングルサインオン。 one_drive_sharepoint_file_storage: OneDrive/SharePointファイルストレージ placeholder_users: プレースホルダー ユーザー portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: プロジェクトリストの共有 readonly_work_packages: 読み取り専用のワークパッケージ scim_api: SCIMサーバーAPI @@ -2425,8 +2465,8 @@ ja: description: "参照された属性とテキストを使用して自動生成された件名を作成します。" customize_life_cycle: description: "PM2プロジェクトサイクル計画で提供されるものとは異なるプロジェクトフェーズを作成して整理します。" - conditional_highlighting: - description: "質量から目立つ特定のワークパッケージが必要ですか? ワークパッケージテーブルで条件付きハイライトを使用します。" + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "ワークパッケージの一覧で関係を表示しますか?" edit_attribute_groups: @@ -2456,6 +2496,8 @@ ja: custom_actions: title: "カスタムアクション" description: "カスタムアクションは、ステータスに基づいて特定のワークパッケージで利用できる、事前に定義されたアクションです。" + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Nextcloudストレージへのシングルサインオン" description: "シングルサインオンでNextcloudストレージのシームレスかつセキュアな認証を可能にします。アクセス管理を簡素化し、ユーザーの利便性を向上させます。" @@ -2467,6 +2509,8 @@ ja: description: "SAML または OpenID Connect を使用して外部の SSO プロバイダ経由でログインし、既存の ID システムとのシームレスなアクセスと統合を可能にします。" virus_scanning: description: "他のユーザーがアクセスできるようになる前に、OpenProjectにアップロードされたファイルがウイルスでスキャンされていることを確認してください。" + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: プレースホルダー ユーザー description: > @@ -2587,8 +2631,8 @@ ja: time_entry: "時系列ログが編集されました。" wiki_page: "Wiki ページが編集されました。" work_package_closed: "作業が完了" - work_package_edit: "仕事項目が編集されました。" - work_package_note: "仕事項目の注記が追加されました。" + work_package_edit: "ワークパッケージが編集されました" + work_package_note: "ワークパッケージに注記が追加されました" title: project: "プロジェクト: %{name}" subproject: "子プロジェクト: %{name}" @@ -2624,7 +2668,7 @@ ja: caption: "リスト内のすべてのワークパッケージの詳細レポートにワークパッケージをエクスポートします。" gantt: label: "ガントチャート" - caption: "ガントチャート表示で作業パッケージ一覧をエクスポートします。" + caption: "ガントチャート表示でワークパッケージ一覧をエクスポートします。" include_images: label: "画像を含める" caption: "PDFエクスポートのサイズを小さくするために画像を除外します。" @@ -2763,19 +2807,17 @@ ja: learn_about: "すべての新機能の詳細" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "エンタープライズ版にアップグレード" postgres_migration: "PostgreSQL にインストールを移行しています" @@ -2832,9 +2874,9 @@ ja: totals_removed_from_childless_work_packages: >- バージョンアップデートを伴う親でないワークパッケージに対して作業と進捗の合計が自動的に削除されます。 これはメンテナンス作業であり、無視することができます。 total_percent_complete_mode_changed_to_work_weighted_average: >- - 「Work」が含まれていない子作業パッケージは無視されます。 + 「予定時間」が含まれていない子ワークパッケージは無視されます。 total_percent_complete_mode_changed_to_simple_average: >- - 子作業パッケージの作業値が無視されています。 + 子ワークパッケージの作業値が無視されています。 links: configuration_guide: "設定ガイド" get_in_touch: "ご質問がありますか?ご連絡ください。" @@ -2843,14 +2885,17 @@ ja: instructions_after_error: "%{signin} をクリックして再びログインを試行できます。エラーが解決しない場合は、管理者にお問い合わせください。" menus: admin: - mail_notification: "電子メールの通知" - mails_and_notifications: "電子メールと通知" + ai: "Artificial Intelligence (AI)" aggregation: "集計" api_and_webhooks: "APIとWebhooks" + mail_notification: "電子メールの通知" + mails_and_notifications: "電子メールと通知" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "追加" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "表示するアクセス トークンはありません" description: "すべてが無効になっています。管理メニューで再度有効にすることができます。" @@ -2860,34 +2905,56 @@ ja: expiration: "有効期限" indefinite_expiration: "なし" simple_revoke_confirmation: "このトークンを取り消してもよろしいですか?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API トークンを使用すると、サードパーティのアプリケーションが REST API 経由でこの OpenProject サイトと通信できます。" + static_token_name: "API token" disabled_text: "API トークンは管理者によって有効化されていません。この機能を使用するには管理者に問い合わせてください。" - add_button: "API トークン" - api: - static_token_name: "APIトークン" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar サブスクリプションは管理者によって有効になっていません。この機能を使用するには管理者に問い合わせてください。" - empty_text_hint: "iCalendar トークンを追加するには、プロジェクトの Calendar モジュール内から新規または既存のカレンダーを購読します。 必要な権限が必要です。" - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth トークンにより、サードパーティ製アプリケーションがこの OpenProject サイトと接続できます。" - empty_text_hint: "サードパーティーのアプリケーションへのアクセスが設定されておらず、アクティブになっていません。この機能を有効にするには管理者に問い合わせてください。" - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "RSS トークンにより、ユーザーは外部 RSS リーダーを介してこの OpenProject サイトの最新の変更に追いつくことができます。" - static_token_name: "RSS トークン" - disabled_text: "RSSトークンは管理者によって有効になっていません。この機能を使用するには管理者に問い合わせてください。" + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "ファイルストレージ" - text_hint: "ファイルストレージトークンは、このOpenProjectサイトを外部ファイルストレージと接続します。" - empty_text_hint: "アカウントにリンクされたストレージへのアクセス権がありません。" - revoke_token: "本当にこのトークンを削除しますか? %{storage}に再度ログインする必要があります" - removed: "ファイルストレージトークンを削除しました" - failed: "エラーが発生し、トークンを削除できませんでした。後でもう一度お試しください。" unknown_storage: "不明なストレージ" notifications: reasons: @@ -2949,6 +3016,7 @@ ja: label_always_visible: "常に表示" label_announcement: "お知らせ" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "APIアクセスキー" label_api_access_key_created_on: "APIアクセスキーが%{value}前に作成されました" label_api_access_key_type: "API" @@ -3204,6 +3272,7 @@ ja: label_journal_diff: "説明の比較" label_language: "言語" label_languages: "言語" + label_external_links: "External links" label_locale: "言語と地域" label_jump_to_a_project: "プロジェクトへ移動..." label_keyword_plural: "キーワード" @@ -3367,7 +3436,7 @@ ja: label_privacy_policy: "データのプライバシーとセキュリティポリシー" label_product_version: "製品バージョ​​ン" label_profile: "プロファイル" - label_percent_complete: "完成(%)" + label_percent_complete: "進捗度(%)" label_progress_tracking: "進行状況の追跡" label_project: "プロジェクト" label_project_activity: "プロジェクトのアクティビティ" @@ -3381,9 +3450,6 @@ ja: label_project_hierarchy: "プロジェクトの階層構造" label_project_mappings: "プロジェクト" label_project_new: "新規プロジェクト" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "プロジェクト" label_project_list_plural: "プロジェクト一覧" label_project_life_cycle: "プロジェクトのライフ サイクル" @@ -3418,7 +3484,7 @@ ja: label_relation_edit: "リレーションを編集" label_relation_new: "新しい関係" label_release_notes: "リリースノート" - label_remaining_work: "残りの作業" + label_remaining_work: "残時間" label_remove_column: "列を削除" label_remove_columns: "選択した列を削除" label_renamed: "名称変更" @@ -3486,7 +3552,7 @@ ja: label_subproject_plural: "子プロジェクト" label_subitems: "Subitems" label_subtask_plural: "子タスク" - label_summary: "サマリ" + label_summary: "サマリー(概要)" label_system: "システム" label_system_storage: "ストレージ情報" label_table_of_contents: "目次" @@ -3573,7 +3639,7 @@ ja: label_wiki_show_new_page_link: "下位のメニューで「子ページを新規作成」の項目を表示" label_wiki_show_submenu_item: "上位のメニュー項目" label_wiki_start: "開始ページ" - label_work: "仕事" + label_work: "予定時間" label_work_package: "ワーク パッケージ" label_work_package_attachments: "ワークパッケージの添付ファイル" label_work_package_category_new: "新規カテゴリ" @@ -3592,7 +3658,7 @@ ja: label_workflow: "ワークフロー" label_workflow_copy: "ワークフローをコピー" label_workflow_plural: "ワークフロー" - label_workflow_summary: "サマリ" + label_workflow_summary: "サマリー(概要)" label_working_days_and_hours: "稼働日・時間" label_x_closed_work_packages_abbr: one: "1件完了" @@ -3689,7 +3755,7 @@ ja: note: "注意: “%{note}”" sharing: work_packages: - allowed_actions: "この作業パッケージは %{allowed_actions} 可能です。プロジェクトのロールと権限によって変更できます。" + allowed_actions: "このワークパッケージは %{allowed_actions} 可能です。プロジェクトのロールと権限によって変更できます。" create_account: "このワークパッケージにアクセスするには、 %{instance} のアカウントを作成して有効化する必要があります。" open_work_package: "ワークパッケージを開く" subject: "ワークパッケージ%{id} があなたと共有されました" @@ -3846,7 +3912,7 @@ ja: notice_not_authorized: "このページにアクセスする権限がありません。" notice_not_authorized_archived_project: "アクセスしようとしたプロジェクトはアーカイブされています。" notice_requires_enterprise_token: "エンタープライズトークンが見つからないか、このページへのアクセスを許可していません。" - notice_password_confirmation_failed: "パスワードが正しくありません。続行できません。" + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "%{number} の検索結果があります。 \n タブで最初の結果へフォーカスします。" notice_principals_found_single: "1 つの結果があります。 \n タブでフォーカスします。" notice_parent_item_not_found: "Parent item not found." @@ -3959,7 +4025,7 @@ ja: permission_log_own_time: "作業時間の記録" permission_log_time: "他のユーザーの作業時間" permission_manage_forums: "フォーラムの管理" - permission_manage_categories: "仕事項目のカテゴリの管理" + permission_manage_categories: "ワークパッケージのカテゴリの管理" permission_manage_dashboards: "ダッシュボードの管理" permission_manage_work_package_relations: "ワークパッケージの関係の管理" permission_manage_members: "メンバーの管理" @@ -4197,7 +4263,10 @@ ja: search_input_placeholder: "検索…" setting_allowed_link_protocols: "許可されたリンクプロトコル" setting_allowed_link_protocols_text_html: >- - これらのプロトコルを、作業パッケージの説明、長文フィールド、およびコメント内でリンクとして表示できるようにします。例えば、%{tel_code} や %{element_code} などです。1行に1つのプロトコルを入力してください。
    %{http_code}、%{https_code}、および %{mailto_code} のプロトコルは常に許可されています。 + これらのプロトコルを、ワークパッケージの説明、長文フィールド、およびコメント内でリンクとして表示できるようにします。例えば、%{tel_code} や %{element_code} などです。1行に1つのプロトコルを入力してください。
    %{http_code}、%{https_code}、および %{mailto_code} のプロトコルは常に許可されています。 + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "最初のログインリダイレクト" setting_after_first_login_redirect_url_text_html: > 最初のログイン後にユーザーをリダイレクトするパスを設定します。空の場合は、オンボーディングツアーのホームページにリダイレクトします。
    例: /my/page @@ -4210,11 +4279,17 @@ ja: setting_apiv3_cors_origins_text_html: > CORS が有効になっている場合、これらは OpenProject API へのアクセスが許可されている起源です。
    期待される値を指定する方法については、 Origin ヘッダー のドキュメントを確認してください。 setting_apiv3_write_readonly_attributes: "読み取り専用属性への書き込み権限" - setting_apiv3_write_readonly_attributes_instructions_html: > - この API を有効にすると、管理者は作成時に createdAt や author などの静的な読み取り専用属性を書き込むことができるようになります。
    警告この設定はデータのインポートなどのユースケースを持ちますが、管理者が他のユーザーになりすましてアイテムを作成することを可能にします。しかし、すべての作成リクエストは真の作成者として記録されます。
    属性とサポートされるリソースの詳細については、 %{api_documentation_link}を参照してください。 + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "API ページの最大サイズ" - setting_apiv3_max_page_instructions_html: > - API が応答する最大ページサイズを設定します。 単一ページでより多くの値を返すAPIリクエストを実行することはできません。
    警告: 必要な理由がわかった場合にのみ、この値を変更してください。 高い値に設定すると、パフォーマンスへの影響が大きくなります。 に対し、ページ化されたビューでは、ページ化されたビューでエラーが発生します。 + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "文章" setting_apiv3_docs_enabled: "ドキュメントページを有効にする" setting_apiv3_docs_enabled_instructions_html: > @@ -4294,12 +4369,12 @@ ja: setting_work_package_done_ratio: "進行状況計算モード" setting_work_package_done_ratio_field: "ワークベース" setting_work_package_done_ratio_field_caption_html: >- - Complete %は自由に設定できる。オプションでWorkに値を入力すると、自動的にRemaining workが導き出される。 + Complete %は自由に設定できる。オプションで予定時間に値を入力すると、自動的に残時間が導き出される。 setting_work_package_done_ratio_status: "ステータスベース" setting_work_package_done_ratio_status_caption_html: >- 各ステータスには、 % Complete の値があります。ステータスを変更すると、 % Complete が変わります。 setting_work_package_done_ratio_explanation_html: > - ワーク・ベース・モードでは、完了(%)は自由に設定することができます。 オプションで「作業」に値を入力すると、自動的に「残りの作業」が導き出されます。 ステータス・ベース・モードでは、各ステータスに 完了(%) の値が関連付けられます。 ステータスを変更すると、完了(%) も変更される。 + ワーク・ベース・モードでは、完了(%)は自由に設定することができます。 オプションで「作業」に値を入力すると、自動的に「残時間」が導き出されます。 ステータス・ベース・モードでは、各ステータスに 完了(%) の値が関連付けられます。 ステータスを変更すると、完了(%) も変更される。 setting_work_package_properties: "項目名" setting_work_package_startdate_is_adddate: "今日の日付を新しいワークパッケージの開始日とする" setting_work_packages_projects_export_limit: "ワークパッケージ/プロジェクトのエクスポート制限" @@ -4323,10 +4398,10 @@ ja: setting_password_min_length: "最短長" setting_password_min_adhered_rules: "最小限の必要な文字の種類" setting_per_page_options: "オプションページごとの項目数" - setting_percent_complete_on_status_closed: "% ステータスが閉じられたときに完了します" + setting_percent_complete_on_status_closed: "ワークパッケージが終了したときの処理" setting_percent_complete_on_status_closed_no_change: "変更なし" setting_percent_complete_on_status_closed_no_change_caption_html: >- - 作業パッケージが閉じられても、完了率の値は変わりません。 + ワークパッケージが閉じられても、完了率の値は変わりません。 setting_percent_complete_on_status_closed_set_100p: "自動的に100%に設定" setting_percent_complete_on_status_closed_set_100p_caption: >- 終了したワークパッケージは完了したとみなされます。 @@ -4371,12 +4446,12 @@ ja: setting_sys_api_description: "リポジトリ管理Webサービスは、リポジトリへのアクセスの統合およびユーザー認証を提供します。" setting_time_format: "時間" setting_total_percent_complete_mode: "完了率階層合計の計算" - setting_total_percent_complete_mode_work_weighted_average: "仕事によるウェイト" + setting_total_percent_complete_mode_work_weighted_average: "予定時間によるウェイト" setting_total_percent_complete_mode_work_weighted_average_caption_html: >- - 総完了率は、階層内の各作業パッケージの作業に対して重み付けされる。作業のないワークパッケージは無視される。 + 総完了率は、階層内の各ワークパッケージの作業に対して重み付けされる。作業のないワークパッケージは無視される。 setting_total_percent_complete_mode_simple_average: "単純平均" setting_total_percent_complete_mode_simple_average_caption_html: >- - 作業は無視され、合計完了率は階層内の作業パッケージの完了(%)の単純平均値となります。 + 作業は無視され、合計完了率は階層内のワークパッケージの完了(%)の単純平均値となります。 setting_accessibility_mode_for_anonymous: "匿名ユーザ向けにアクセシビリティモードを有効" setting_user_format: "ユーザー名の形式" setting_user_default_timezone: "ユーザーのデフォルトのタイム ゾーン" @@ -4399,12 +4474,12 @@ ja: omniauth_direct_login_hint_html: > このオプションが有効な場合、ログイン要求は設定された omniauth プロバイダにリダイレクトされます。ログインドロップダウンとサインインページは無効になります。
    注意:パスワードログインも無効にしない限り、このオプションを有効にした場合でも、ユーザは内部的に %{internal_path}ログインページにアクセスしてログインすることができます。 remapping_existing_users_hint: > - 有効にすると、設定された ID プロバイダは、ユーザが以前にそのプロバイダを通してサインインしたことがなくても、メールアドレスに基づいて既存のユーザにログインできるようになります。これは、OpenProject サイトを新しい SSO プロバイダに移行するときに便利ですが、サイトのすべてのユーザから信頼されていないプロバイダを使用するときには推奨されません。 + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > アップロードされたファイルに有効なファイル拡張子および/または MIME タイプのリストを定義します。
    ファイル拡張子(例. %{ext_example})またはMIMEタイプ(例、 %{mime_example}).
    任意のファイル タイプをアップロードできるようにするには、空のままにします。複数の値を指定できます (各値に 1 行)。 show_work_package_attachments: > - このオプションを無効にすると、新規プロジェクトの作業パッケージのファイルタブにある添付ファイルリストが非表示になります。ワークパッケージの説明に添付されたファイルは、内部添付ファイルストレージにアップロードされます。 + このオプションを無効にすると、新規プロジェクトのワークパッケージのファイルタブにある添付ファイルリストが非表示になります。ワークパッケージの説明に添付されたファイルは、内部添付ファイルストレージにアップロードされます。 antivirus: title: "ウイルススキャン" clamav_ping_failed: "ClamAVデーモンへの接続に失敗しました。設定を再確認して、もう一度試してください。" @@ -4505,7 +4580,7 @@ ja: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4576,7 +4651,7 @@ ja: text_are_you_sure: "よろしいですか?" open_link_in_a_new_tab: "Open link in a new tab" text_are_you_sure_continue: "続行してもよろしいですか?" - text_are_you_sure_with_children: "仕事項目と子項目を削除してもよろしいですか?" + text_are_you_sure_with_children: "ワークパッケージと子項目を削除してもよろしいですか?" text_are_you_sure_with_project_custom_fields: "この属性を削除すると、すべてのプロジェクトの値も削除されます。よろしいですか?" text_are_you_sure_with_project_life_cycle_step: "このフェーズを削除すると、すべてのプロジェクトでの使用も削除されます。よろしいですか?" text_assign_to_project: "プロジェクト自体に割り当てする" @@ -4624,7 +4699,7 @@ ja: text_default_administrator_account_changed: "管理者アカウントでデフォルト設定が変更済み" text_default_encoding: "既定値: UTF-8" text_destroy: "削除" - text_destroy_with_associated: "削除される仕事項目と追加の対象物が関連付けています。それらの対象物は次の種類です:" + text_destroy_with_associated: "削除されるワークパッケージと追加の対象物が関連付けています。それらの対象物は次の種類です:" text_destroy_what_to_do: "どれかを選択して下さい。" text_diff_truncated: "... 差分の行数が表示可能な上限を超えました。超過分は表示しません。" text_email_delivery_not_configured: "メール配信が設定されておらず、通知が無効になっています。\nSMTPサーバーを有効にしてください。" @@ -4673,6 +4748,7 @@ ja: 602/5000 注:有効にすると、%{information_panel_label}管理パネルとホームページに、インストールステータスのバッジが表示されます。 管理者のみに表示されます。
    バッジは、最新のOpenProjectバージョンを公式のOpenProjectリリースデータベースと照合して、アップデートや既知の脆弱性について警告します。 チェックの内容、利用可能なアップデートを提供するために必要なデータ、およびこのチェックを無効にする方法の詳細については、設定ドキュメントをご覧ください。 text_own_membership_delete_confirmation: "一部またはすべての権限を自分自身から剥奪しようとしているため、このプロジェクトを編集できなくなる可能性があります。\n本当に続けますか?" text_permanent_delete_confirmation_checkbox_label: "私は、この削除は取り消すことができないことを理解しています。" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "プラグインの「assets」ディレクトリが書き込み可能" text_powered_by: "Powered by %{link}" text_project_identifier_info: "アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。アルファベット小文字で始まる必要があります。" @@ -4825,23 +4901,23 @@ ja: label_note: "注:" modal: work_based_help_text: "各フィールドは、可能な限り他の2つのフィールドから自動的に計算される。" - status_based_help_text: "完了率は作業パッケージのステータスによって設定される。" - migration_warning_text: "作業ベースの進捗計算モードでは、「完了率」を手動で設定することはできず、「作業」に関連付けられます。既存の値は保持されていますが、編集することはできません。まずWorkを入力してください。" + status_based_help_text: "完了率はワークパッケージのステータスによって設定される。" + migration_warning_text: "作業ベースの進捗計算モードでは、「完了率」を手動で設定することはできず、「作業」に関連付けられます。既存の値は保持されていますが、編集することはできません。まず予定時間を入力してください。" derivation_hints: done_ratio: cleared_because_remaining_work_is_empty: "残務がないためクリア。" - cleared_because_work_is_0h: "Work が 0h のためクリアされる。" - derived: "仕事」と「残り仕事」から派生したもの。" + cleared_because_work_is_0h: "予定時間 が 0h のためクリアされる。" + derived: "「予定時間」と「残時間」から派生したもの。" estimated_hours: - cleared_because_remaining_work_is_empty: "残りの作業が空のため消去されました。" - derived: "残りの作業と % 完了から派生しました。" - same_as_remaining_work: "残りの作業と同じ値に設定します。" + cleared_because_remaining_work_is_empty: "残時間が空のため消去されました。" + derived: "残時間と % 完了から派生しました。" + same_as_remaining_work: "残時間と同じ値に設定します。" remaining_hours: cleared_because_work_is_empty: "ワークが空のためクリア。" cleared_because_percent_complete_is_empty: "完了(%) が空のため、クリアされました。" decreased_by_delta_like_work: "%{delta}によって減少しました。作業の減少に一致します。" derived: "作品と完成度から派生したもの。" - increased_by_delta_like_work: "%{delta}、仕事の増加に合わせて増加した。" + increased_by_delta_like_work: "%{delta}、予定時間の増加に合わせて増加した。" same_as_work: "ワークと同じ値に設定する。" permissions: comment: "コメント" @@ -5166,3 +5242,8 @@ ja: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/js-af.yml b/config/locales/crowdin/js-af.yml index cc730b35a0d..ab8cfd461c8 100644 --- a/config/locales/crowdin/js-af.yml +++ b/config/locales/crowdin/js-af.yml @@ -633,9 +633,6 @@ af: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ar.yml b/config/locales/crowdin/js-ar.yml index 75bd0063cb2..04305661c9c 100644 --- a/config/locales/crowdin/js-ar.yml +++ b/config/locales/crowdin/js-ar.yml @@ -637,9 +637,6 @@ ar: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "تحتاج إلى إدخال كلمة مرور حسابك لتأكيد هذا التغيير." - title: "أكِّد كلمة مرورك للمواصلة" pagination: no_other_page: "أنت في الصفحة فقط." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-az.yml b/config/locales/crowdin/js-az.yml index 2cf7bdd81e8..1bc2ce5ba1d 100644 --- a/config/locales/crowdin/js-az.yml +++ b/config/locales/crowdin/js-az.yml @@ -633,9 +633,6 @@ az: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-be.yml b/config/locales/crowdin/js-be.yml index 19cd9dab5cd..98dc86615e7 100644 --- a/config/locales/crowdin/js-be.yml +++ b/config/locales/crowdin/js-be.yml @@ -635,9 +635,6 @@ be: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-bg.yml b/config/locales/crowdin/js-bg.yml index c947da72533..e94ac60f829 100644 --- a/config/locales/crowdin/js-bg.yml +++ b/config/locales/crowdin/js-bg.yml @@ -633,9 +633,6 @@ bg: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index ed0692463a4..b4773fd1995 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -633,9 +633,6 @@ ca: add: "Afegeix configuracions pel projecte" already_selected: "Aquest projecte ja està seleccionat" remove: "Elimina les configuracions del projecte" - password_confirmation: - field_description: "Necessites introduir la contrasenya del teu compte per a confirmar aquest canvi." - title: "Confirma la teva contrasenya per continuar" pagination: no_other_page: "Estàs en la pàgina única." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ckb-IR.yml b/config/locales/crowdin/js-ckb-IR.yml index 793dc8bbbaa..e5f85695a8c 100644 --- a/config/locales/crowdin/js-ckb-IR.yml +++ b/config/locales/crowdin/js-ckb-IR.yml @@ -633,9 +633,6 @@ ckb-IR: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml index 8b03034f5b7..a159cd4100c 100644 --- a/config/locales/crowdin/js-cs.yml +++ b/config/locales/crowdin/js-cs.yml @@ -635,9 +635,6 @@ cs: add: "Přidat nastavení pro projekt" already_selected: "Tento projekt je již vybrán" remove: "Odstranit nastavení projektu" - password_confirmation: - field_description: "Pro potvrzení této změny je třeba zadat heslo k účtu." - title: "Pro pokračování potvrďte vaše heslo" pagination: no_other_page: "Jste na jediné stránce." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-da.yml b/config/locales/crowdin/js-da.yml index 74f6ed878fb..27c08614404 100644 --- a/config/locales/crowdin/js-da.yml +++ b/config/locales/crowdin/js-da.yml @@ -632,9 +632,6 @@ da: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index d3f518546d3..902f1884686 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -425,7 +425,7 @@ de: label_remove_row: "Zeile entfernen" label_report: "Auswertung" label_repository_plural: "Projektarchive" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Größe des Projektmenüs ändern" label_save_as: "Speichern unter" label_search_columns: "Spalte suchen" label_select_watcher: "Beobachter auswählen ..." @@ -632,9 +632,6 @@ de: add: "Einstellung für Projekt hinzufügen" already_selected: "Dieses Projekt ist bereits ausgewählt" remove: "Projektspezifische Einstellungen entfernen" - password_confirmation: - field_description: "Sie müssen Ihr Kennwort eingeben, um diese Änderungen zu speichern." - title: "Geben Sie Ihr Kennwort ein, um fortzufahren" pagination: no_other_page: "Sie befinden sich auf der einzigen Seite." pages_skipped: "Seiten übersprungen." diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml index e90d218ade3..1638f15fc99 100644 --- a/config/locales/crowdin/js-el.yml +++ b/config/locales/crowdin/js-el.yml @@ -632,9 +632,6 @@ el: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Πρέπει να εισάγετε τον κωδικό πρόσβασης του λογαριασμού σας για να επιβεβαιώσετε αυτή την αλλαγή." - title: "Επιβεβαιώστε τον κωδικό πρόσβασης σας για να συνεχίσετε" pagination: no_other_page: "Βρίσκεστε στη μοναδική σελίδα." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-eo.yml b/config/locales/crowdin/js-eo.yml index 766ee1ad579..6dbc114eca0 100644 --- a/config/locales/crowdin/js-eo.yml +++ b/config/locales/crowdin/js-eo.yml @@ -633,9 +633,6 @@ eo: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Vi devas enirigi vian kontan pasvorton por konfirmi tiun ĉi ŝanaĝon." - title: "Konfirmu vian pasvorton por daŭrigi" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index a4d8eda4008..b2505deda62 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -203,8 +203,8 @@ es: add_table: "Agregar tabla de paquetes de trabajo relacionados" edit_query: "Editar consulta" new_group: "Nuevo grupo" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Eliminar grupo" + remove_attribute: "Eliminar del grupo" reset_to_defaults: "Restablecer valores predeterminados" working_days: calendar: @@ -426,7 +426,7 @@ es: label_remove_row: "Eliminar fila" label_report: "Reportar" label_repository_plural: "Repositorios" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Cambiar el tamaño del menú del proyecto" label_save_as: "Guardad como" label_search_columns: "Buscar una columna" label_select_watcher: "Selecciona un observador..." @@ -633,9 +633,6 @@ es: add: "Añadir configuración para el proyecto" already_selected: "Este proyecto ya está seleccionado" remove: "Eliminar configuración del proyecto" - password_confirmation: - field_description: "Necesitas introducir la contraseña de tu cuenta para confirmar este cambio." - title: "Confirma tu contraseña para continuar" pagination: no_other_page: "Usted está en la única página." pages_skipped: "Páginas omitidas." diff --git a/config/locales/crowdin/js-et.yml b/config/locales/crowdin/js-et.yml index e9e9587a571..a459b13dd6b 100644 --- a/config/locales/crowdin/js-et.yml +++ b/config/locales/crowdin/js-et.yml @@ -633,9 +633,6 @@ et: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-eu.yml b/config/locales/crowdin/js-eu.yml index 1cee5e33a54..9065b53b74a 100644 --- a/config/locales/crowdin/js-eu.yml +++ b/config/locales/crowdin/js-eu.yml @@ -633,9 +633,6 @@ eu: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-fa.yml b/config/locales/crowdin/js-fa.yml index cf5e85c524d..a535619bd7f 100644 --- a/config/locales/crowdin/js-fa.yml +++ b/config/locales/crowdin/js-fa.yml @@ -633,9 +633,6 @@ fa: add: "Add setting for project" already_selected: "این پروژه قبلاً انتخاب شده است" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-fi.yml b/config/locales/crowdin/js-fi.yml index 3b3b74a58f4..12f60bca8bf 100644 --- a/config/locales/crowdin/js-fi.yml +++ b/config/locales/crowdin/js-fi.yml @@ -633,9 +633,6 @@ fi: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Sinun täytyy syöttää tilisi salasana vahvistaaksesi tämän muutoksen." - title: "Vahvista salasanasi jatkaaksesi" pagination: no_other_page: "Olet jo ainoalla sivulla." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-fil.yml b/config/locales/crowdin/js-fil.yml index d806e707dcf..e90b9bc3be3 100644 --- a/config/locales/crowdin/js-fil.yml +++ b/config/locales/crowdin/js-fil.yml @@ -633,9 +633,6 @@ fil: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Kailangan mong ipasok ang iyong akwant password upang kumpirmahin ang pagbabago niito." - title: "Kumpirmahin ang iyong password upanh magpatuloy" pagination: no_other_page: "Ikaw ay nasa pahina lamang." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 0fbcfc2db30..27c30489db1 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -426,7 +426,7 @@ fr: label_remove_row: "Supprimer la ligne" label_report: "Rapport" label_repository_plural: "Dépôts" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Redimensionner le menu du projet" label_save_as: "Enregistrer sous" label_search_columns: "Rechercher une colonne" label_select_watcher: "Sélectionner un observateur…" @@ -633,9 +633,6 @@ fr: add: "Ajouter un paramètre pour le projet" already_selected: "Ce projet est déjà sélectionné" remove: "Suppression des paramètres de projet" - password_confirmation: - field_description: "Vous devez saisir le mot de passe de votre compte pour confirmer ce changement." - title: "Confirmez votre mot de passe pour continuer" pagination: no_other_page: "Vous êtes sur la seule page." pages_skipped: "Pages ignorées." diff --git a/config/locales/crowdin/js-he.yml b/config/locales/crowdin/js-he.yml index b06e73ff138..c049c42e432 100644 --- a/config/locales/crowdin/js-he.yml +++ b/config/locales/crowdin/js-he.yml @@ -635,9 +635,6 @@ he: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-hi.yml b/config/locales/crowdin/js-hi.yml index 471f14facc1..df981a1125e 100644 --- a/config/locales/crowdin/js-hi.yml +++ b/config/locales/crowdin/js-hi.yml @@ -633,9 +633,6 @@ hi: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-hr.yml b/config/locales/crowdin/js-hr.yml index a1d9f11ea96..9975644c505 100644 --- a/config/locales/crowdin/js-hr.yml +++ b/config/locales/crowdin/js-hr.yml @@ -634,9 +634,6 @@ hr: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Potvrdite lozinku za nastavak" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-hu.yml b/config/locales/crowdin/js-hu.yml index 4606c09284c..cb964f5e788 100644 --- a/config/locales/crowdin/js-hu.yml +++ b/config/locales/crowdin/js-hu.yml @@ -632,9 +632,6 @@ hu: add: "Beállítás hozzáadása a projekthez" already_selected: "A projekt már ki lett választva" remove: "Projekt beállítások eltávolítása" - password_confirmation: - field_description: "A változás megerősítéséhez adja meg jelszavát." - title: "Adja meg a jelszavát a folytatáshoz" pagination: no_other_page: "Csak egyetlen oldalon tartózkodik." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml index 3c9dab4f909..6930060da80 100644 --- a/config/locales/crowdin/js-id.yml +++ b/config/locales/crowdin/js-id.yml @@ -216,10 +216,10 @@ id: change_button: "Save and reschedule" change_title: "Ubah hari kerja" removed_title: "You will remove the following days from the non-working days list:" - change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance." + change_description: "Perubahan hari dalam seminggu yang dianggap sebagai hari kerja atau hari libur dapat memengaruhi tanggal mulai dan selesai dari semua paket kerja dan siklus hidup dalam semua proyek pada kasus ini." warning: > - The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated. - Are you sure you want to continue? + Perubahan tersebut mungkin memerlukan waktu untuk berlaku. Anda akan diberitahu ketika semua paket kerja yang relevan dan siklus hidup proyek telah diperbarui. + Apakah Anda yakin ingin melanjutkan? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- Changing progress calculation mode from status-based to work-based will make the % Complete field freely editable. If you optionally enter values for Work or Remaining work, they will also be linked to % Complete. Changing Remaining work can then update % Complete. @@ -558,11 +558,11 @@ id: date_alerts: milestone_date: "Milestone date" overdue: "Overdue" - overdue_since: "for %{difference_in_days}." - property_today: "is today." - property_is: "is in %{difference_in_days}." - property_was: "was %{difference_in_days} ago." - property_is_deleted: "is deleted." + overdue_since: "untuk %{difference_in_days}." + property_today: "hari ini." + property_is: "dalam %{difference_in_days}." + property_was: "%{difference_in_days} hari yang lalu." + property_is_deleted: "telah dihapus." center: label_actor_and: "dan" and_more_users: @@ -632,14 +632,11 @@ id: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Anda harus mengisi kata sandi akun untuk mengkonfirmasi perubahan." - title: "Konfirmasi kata sandi anda untuk melanjutkan" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." - page_navigation: "Pagination navigation" - per_page_navigation: 'Items per page selection' + page_navigation: "Navigasi halaman" + per_page_navigation: 'Pilihan jumlah item per halaman' pages: page_number: Page %{number} show_per_page: Show %{number} per page @@ -766,7 +763,7 @@ id: update_relation: "Klik untuk mengganti jenis hubungan" show_relations: "Show relations" add_predecessor: "Tambahkan pendahulu" - add_successor: "Add successor" + add_successor: "Tambahkan penerus" remove: "Remove relation" save: "Save relation" abort: "Abort" @@ -824,7 +821,7 @@ id: bulk_actions: edit: "Edit massal" delete: "Penghapusan massal" - duplicate: "Bulk duplicate" + duplicate: "Duplikat massal" move: "Bulk change of project" button_clear: "Clear" comment_added: "The comment was successfully added." @@ -870,7 +867,7 @@ id: header_with_parent: "New %{type} (Child of %{parent_type} #%{id})" button: "Buat baru" duplicate: - title: "Duplicate work package" + title: "Duplikat paket kerja" hierarchy: show: "Menampilkan modus hiraki" hide: "Sembunyikan modus hirarki" @@ -981,7 +978,7 @@ id: is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages." sharing: title: "Share work package" - show_all_users: "Show all users with whom the work package has been shared with" + show_all_users: "Tampilkan semua pengguna yang telah dibagikan paket kerja ini" table: configure_button: "Configure work package table" summary: "Table with rows of work package and columns of work package attributes." @@ -1156,7 +1153,7 @@ id: selected_filter: all: "Semua proyek" selected: "Only selected" - search_placeholder: "Search projects..." + search_placeholder: "Cari proyek..." search_placeholder_favorites: "Search favorites..." include_subprojects: "Include all sub-projects" tooltip: @@ -1213,7 +1210,7 @@ id: close: "Close modal" open_project_storage_modal: waiting_title: - timeout: "Timeout" + timeout: "Waktu habis" waiting_subtitle: network_off: "There is a network problem." network_on: "Network is back. We are trying." diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml index e0d9a458a84..6e84a66fcad 100644 --- a/config/locales/crowdin/js-it.yml +++ b/config/locales/crowdin/js-it.yml @@ -203,8 +203,8 @@ it: add_table: "Aggiungi la tabella dei pacchetti di lavoro correlati" edit_query: "Modifica query" new_group: "Nuovo gruppo" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Elimina gruppo" + remove_attribute: "Rimuovi dal gruppo" reset_to_defaults: "Ripristino predefinite" working_days: calendar: @@ -426,7 +426,7 @@ it: label_remove_row: "Rimuovi riga" label_report: "Segnalano" label_repository_plural: "Archivi" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Ridimensiona il menu del progetto" label_save_as: "Salva come" label_search_columns: "Cerca una colonna" label_select_watcher: "Seleziona un osservatore..." @@ -633,9 +633,6 @@ it: add: "Aggiungi impostazione per il progetto" already_selected: "Questo progetto è già selezionato" remove: "Rimuovi impostazioni progetto" - password_confirmation: - field_description: "È necessario inserire la password dell'account per confermare la modifica." - title: "Confermare la password per continuare" pagination: no_other_page: "Sei nella pagina unica." pages_skipped: "Pagine saltate." diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml index 56f36f500eb..f4cba405f83 100644 --- a/config/locales/crowdin/js-ja.yml +++ b/config/locales/crowdin/js-ja.yml @@ -525,7 +525,7 @@ ja: add: "プラス(+)アイコンをクリックして新しいカードを作成するか、既存のカードをボード上のリストに追加する。" drag: "リスト内のカードをドラッグ・アンド・ドロップして並び替えたり、別のリストに移動することができます。
    右上の情報(i)アイコンをクリックするか、カードをダブルクリックして詳細を開くことができます。" wp: - toggler: "次に、作業パッケージ セクションを見てみましょう。このセクションでは、あなたの作業についてより詳細な情報を確認できます。" + toggler: "次に、ワークパッケージ セクションを見てみましょう。このセクションでは、あなたの作業についてより詳細な情報を確認できます。" list: "このワークパッケージの概要では、タスク、マイルストーン、フェーズなど、プロジェ クト内のすべての作業を一覧表示します。
    ワークパッケージは、このビューから直接作成・編集することができます。特定のワークパッケージの詳細を見るには、その行をダブルクリックします。" full_view: "ワークパッケージ詳細ビューは、ワークパッケージの説明、ステータス、優先度、アクティビティ、依存関係、コメントなど、ワークパッケージに関連するすべての情報を提供する。" back_button: "終了してワークパッケージリストに戻るには、左上隅のリターン矢印を使用します。" @@ -534,10 +534,10 @@ ja: timeline: "ここでは、プロジェクト計画を編集したり、タスク、マイルストーン、フェーズなどの新しいワークパッケージを作成したり、依存関係を追加したりすることができます。チームメンバー全員がいつでも最新の計画を確認し、更新することができます。" team_planner: overview: "チームプランナーを使えば、チームメンバーにタスクを視覚的に割り当て、誰が何に取り組んでいるかの概要を把握することができます。" - calendar: "週または隔週の計画ボードには、チームメンバーに割り当てられたすべての作業パッケージが表示されます。" + calendar: "週または隔週の計画ボードには、チームメンバーに割り当てられたすべてのワークパッケージが表示されます。" add_assignee: "開始するには、チームプランナーに担当者を追加します。" add_existing: "既存のワークパッケージを検索し、チームプランナーにドラッグすると、即座にチームメンバーに割り当て、開始日と終了日を定義できます。" - card: "作業パッケージを水平方向にドラッグして時間を前後させたり、端をドラッグして開始日と終了日を変更したり、垂直方向にドラッグして別の行に移動して別のメンバーに割り当てることもできます。" + card: "ワークパッケージを水平方向にドラッグして時間を前後させたり、端をドラッグして開始日と終了日を変更したり、垂直方向にドラッグして別の行に移動して別のメンバーに割り当てることもできます。" notifications: title: "通知" no_unread: "未読通知がない" @@ -633,9 +633,6 @@ ja: add: "プロジェクトの設定を追加する" already_selected: "このプロジェクトは既に選択されています" remove: "プロジェクトの設定を削除する" - password_confirmation: - field_description: "この変更を確認するには、アカウントのパスワードを入力する必要があります。" - title: "続行するにはパスワードを確認してください" pagination: no_other_page: "このページだけです。" pages_skipped: "ページがスキップされました。" @@ -657,7 +654,7 @@ ja: context: "プロジェクトのコンテキスト" not_available: "プロジェクトなし" required_outside_context: > - 作業パッケージを作成するプロジェクトを選択して、すべての属性を確認してください。 上記で有効になっているタイプのプロジェクトのみ選択できます。 + ワークパッケージを作成するプロジェクトを選択して、すべての属性を確認してください。 上記で有効になっているタイプのプロジェクトのみ選択できます。 reminders: settings: daily: @@ -701,7 +698,7 @@ ja: error_no_table_configured: "%{group} のテーブルを設定してください。" reset_title: "フォーム設定をリセット" confirm_reset: > - 警告:フォーム設定をリセットしてもよろしいですか? これにより、属性が規定のグループにリセットされ、すべてのカスタムフィールドが無効になります。   コンテキスト| リクエストコンテキスト + 警告:フォーム設定をリセットしてもよろしいですか? これにより、属性がデフォルトのグループにリセットされ、すべてのカスタムフィールドが無効になります。   コンテキスト| リクエストコンテキスト upgrade_to_ee: "エンタープライズ・オンプレミス版へのアップグレード" upgrade_to_ee_text: "すごい!このアドオンが必要なら、あなたはスーパープロです!エンタープライズ版のクライアントになって、私たちオープンソース開発者をサポートしていただけませんか?" more_information: "詳細情報" @@ -714,7 +711,7 @@ ja: timer: start_new_timer: "新しいタイマーを開始する" timer_already_running: "新しいタイマーを開始するには、まず現在のタイマーを停止する必要があります:" - timer_already_stopped: "この作業パッケージのアクティブなタイマーがありません。別のウィンドウで停止しましたか?" + timer_already_stopped: "このワークパッケージのアクティブなタイマーがありません。別のウィンドウで停止しましたか?" tracking_time: "トラッキング・タイム" button_stop: "現在のタイマーを停止する" two_factor_authentication: @@ -888,7 +885,7 @@ ja: limited_results: 手動ソートモードで表示できるのは、 %{count} ワークパッケージだけです。フィルタリングするか、自動ソートに切り替えてください。 property_groups: details: "詳細" - people: "人" + people: "割り当て" estimatesAndTime: "見積もりと 時間" other: "その他" properties: @@ -897,7 +894,7 @@ ja: createdAt: "作成日時" description: "説明" date: "日付" - percentComplete: "完成(%)" + percentComplete: "進捗度(%)" percentCompleteAlternative: "進捗状況" dueDate: "終了日" duration: "期間" @@ -906,7 +903,7 @@ ja: percentageDone: "完了比率" priority: "優先度" projectName: "プロジェクト" - remainingWork: "残りの作業" + remainingWork: "残時間" remainingWorkAlternative: "残り時間" responsible: "責任者" startDate: "開始日" @@ -920,16 +917,16 @@ ja: version: "バージョン" work: "仕事" workAlternative: "予定工数" - remainingTime: "残りの作業" + remainingTime: "残時間" default_queries: manually_sorted: "新しい手動ソートされたクエリ" latest_activity: "最新の活動" created_by_me: "自分が作成したもの" - assigned_to_me: "自分の担当するもの" + assigned_to_me: "自分が担当しているもの" recently_created: "最近作成されたもの" all_open: "未完了" overdue: "期限の過ぎたもの" - summary: "サマリ" + summary: "サマリー(概要)" shared_with_users: "ユーザーと共有" shared_with_me: "共有された項目" jump_marks: diff --git a/config/locales/crowdin/js-ka.yml b/config/locales/crowdin/js-ka.yml index 8cabe291ea1..c8b6b84d50b 100644 --- a/config/locales/crowdin/js-ka.yml +++ b/config/locales/crowdin/js-ka.yml @@ -633,9 +633,6 @@ ka: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-kk.yml b/config/locales/crowdin/js-kk.yml index f205f2dee10..79787430e88 100644 --- a/config/locales/crowdin/js-kk.yml +++ b/config/locales/crowdin/js-kk.yml @@ -633,9 +633,6 @@ kk: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml index 2a09ba088fd..28a1ad4f171 100644 --- a/config/locales/crowdin/js-ko.yml +++ b/config/locales/crowdin/js-ko.yml @@ -203,8 +203,8 @@ ko: add_table: "관련 작업 패키지의 테이블 추가" edit_query: "쿼리 편집" new_group: "새 그룹" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "그룹 삭제" + remove_attribute: "그룹에서 제거" reset_to_defaults: "기본값으로 초기화" working_days: calendar: @@ -426,7 +426,7 @@ ko: label_remove_row: "행 제거" label_report: "보고서" label_repository_plural: "리포지토리" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "프로젝트 메뉴 크기 조정" label_save_as: "다른 이름으로 저장" label_search_columns: "열 검색" label_select_watcher: "주시하는 사람을 선택" @@ -632,9 +632,6 @@ ko: add: "프로젝트에 대한 설정 추가" already_selected: "이 프로젝트는 이미 선택되었습니다." remove: "프로젝트 설정 제거" - password_confirmation: - field_description: "이 변경 내용을 확인하려면 계정 암호를 입력해야 합니다." - title: "계속하려면 암호 확인" pagination: no_other_page: "유일한 페이지에 있습니다." pages_skipped: "페이지를 건너뛰었습니다." diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml index 5a4060cbc79..1caa3b7a2aa 100644 --- a/config/locales/crowdin/js-lt.yml +++ b/config/locales/crowdin/js-lt.yml @@ -635,9 +635,6 @@ lt: add: "Pridėti nustatymą projektui" already_selected: "Šis projektas jau pažymėtas" remove: "Išimti projekto nustatymus" - password_confirmation: - field_description: "Norėdami patvirtinti šį pakeitimą turite įvesti savo paskyros slaptažodį." - title: "Norėdami tęsti, patvirtinkite savo slaptažodį" pagination: no_other_page: "Jūs esate vieninteliame puslapyje." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-lv.yml b/config/locales/crowdin/js-lv.yml index b25ce02885f..ed45f02ad7a 100644 --- a/config/locales/crowdin/js-lv.yml +++ b/config/locales/crowdin/js-lv.yml @@ -634,9 +634,6 @@ lv: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "Jūs esat vienīgajā lapā." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-mn.yml b/config/locales/crowdin/js-mn.yml index 751a9890bca..8b098ad6de4 100644 --- a/config/locales/crowdin/js-mn.yml +++ b/config/locales/crowdin/js-mn.yml @@ -633,9 +633,6 @@ mn: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index 910223b5e29..0dc860b3191 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -632,9 +632,6 @@ ms: add: "Tambah tetapan untuk projek" already_selected: "Projek ini telah dipilih" remove: "Keluarkan tetapan projek" - password_confirmation: - field_description: "Anda perlu memasukkan kata laluan akaun anda untuk mengesahkan perubahan ini." - title: "Sahkan kata laluan anda untuk teruskan" pagination: no_other_page: "Anda berada di satu-satunya halaman." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-ne.yml b/config/locales/crowdin/js-ne.yml index 297601cbdcb..6d76199656a 100644 --- a/config/locales/crowdin/js-ne.yml +++ b/config/locales/crowdin/js-ne.yml @@ -633,9 +633,6 @@ ne: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-nl.yml b/config/locales/crowdin/js-nl.yml index ed44640d58b..d2e0b12812d 100644 --- a/config/locales/crowdin/js-nl.yml +++ b/config/locales/crowdin/js-nl.yml @@ -633,9 +633,6 @@ nl: add: "Instelling voor project toevoegen" already_selected: "Dit project is al geselecteerd" remove: "Projectinstellingen verwijderen" - password_confirmation: - field_description: "U moet uw wachtwoord invoeren om deze wijziging te bevestigen." - title: "Voer uw wachtwoord in om door te gaan" pagination: no_other_page: "U bent op de enige pagina." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 91adc30431b..37d78447d18 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -633,9 +633,6 @@ add: "Legg til innstilling for prosjekt" already_selected: "Dette prosjektet er allerede valgt" remove: "Fjern prosjektinnstillinger" - password_confirmation: - field_description: "Du må skrive inn ditt passord for å bekrefte denne endringen." - title: "Bekreft ditt passord for å fortsette" pagination: no_other_page: "Du er på den eneste siden." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-pl.yml b/config/locales/crowdin/js-pl.yml index ab194f193b9..2ce5b854a69 100644 --- a/config/locales/crowdin/js-pl.yml +++ b/config/locales/crowdin/js-pl.yml @@ -203,8 +203,8 @@ pl: add_table: "Dodaj tabelę powiązanych pakietów roboczych" edit_query: "Edytuj zapytanie" new_group: "Nowa Grupa" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Usuń grupę" + remove_attribute: "Usuń z grupy" reset_to_defaults: "Resetuj do ustawień domyślnych" working_days: calendar: @@ -426,7 +426,7 @@ pl: label_remove_row: "Usuń wiersz" label_report: "Raport" label_repository_plural: "Repozytoria" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Zmień rozmiar menu projektu" label_save_as: "Zapisz jako" label_search_columns: "Wyszukaj kolumnę" label_select_watcher: "Wybierz obserwatora..." @@ -635,9 +635,6 @@ pl: add: "Dodaj ustawienie dla projektu" already_selected: "Ten projekt jest już wybrany" remove: "Usuń ustawienia projektu" - password_confirmation: - field_description: "Musisz wprowadzić hasło do twojego konta aby potwierdzić te zmiany." - title: "Potwierdź hasło aby kontynuować" pagination: no_other_page: "Jesteś na jedynej stronie." pages_skipped: "Pominięte strony." @@ -1135,8 +1132,8 @@ pl: global_search: all_projects: "We wszystkich projektach" close_search: "Zakończ wyszukiwanie" - items_available: "%{count} items available" - direct_hit_available: "Work package with exact ID found. Press Enter to open it." + items_available: "Dostępne elementy: %{count}" + direct_hit_available: "Znaleziono pakiet roboczy o dokładnym identyfikatorze. Aby go otworzyć, naciśnij klawisz Enter." current_project_and_all_descendants: "W tym projekcie + pod projekcie" current_project: "W tym projekcie" recently_viewed: "Ostatnio wyświetlane" diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml index a9323796305..0665eff1c2e 100644 --- a/config/locales/crowdin/js-pt-BR.yml +++ b/config/locales/crowdin/js-pt-BR.yml @@ -202,8 +202,8 @@ pt-BR: add_table: "Adicionar tabela de pacotes de trabalho relacionados" edit_query: "Editar consulta" new_group: "Novo grupo" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Excluir grupo" + remove_attribute: "Remover do grupo" reset_to_defaults: "Voltar à configuração original" working_days: calendar: @@ -425,7 +425,7 @@ pt-BR: label_remove_row: "Remover linha" label_report: "Relatório" label_repository_plural: "Repositórios" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Redimensionar menu do projeto" label_save_as: "Salvar como" label_search_columns: "Buscar uma coluna" label_select_watcher: "Selecione um observador..." @@ -632,9 +632,6 @@ pt-BR: add: "Adicionar configuração para o projeto" already_selected: "Este projeto já está selecionado" remove: "Remover configurações de projeto" - password_confirmation: - field_description: "Você precisa digitar sua senha para confirmar essa alteração." - title: "Confirme sua senha para continuar" pagination: no_other_page: "Você está na página única." pages_skipped: "Páginas puladas." diff --git a/config/locales/crowdin/js-pt-PT.yml b/config/locales/crowdin/js-pt-PT.yml index 20a6f4bafbd..9e400a1d7be 100644 --- a/config/locales/crowdin/js-pt-PT.yml +++ b/config/locales/crowdin/js-pt-PT.yml @@ -203,8 +203,8 @@ pt-PT: add_table: "Adicionar tabela de pacotes de trabalho relacionados" edit_query: "Editar consulta" new_group: "Novo Grupo" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Eliminar grupo" + remove_attribute: "Remover do grupo" reset_to_defaults: "Repor predefinições" working_days: calendar: @@ -426,7 +426,7 @@ pt-PT: label_remove_row: "Remover linha" label_report: "Relatório" label_repository_plural: "Repositórios" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Redimensionar menu do projeto" label_save_as: "Guardar como" label_search_columns: "Pesquisar uma coluna" label_select_watcher: "Selecione um \"observador\"..." @@ -633,9 +633,6 @@ pt-PT: add: "Adicionar configuração ao projeto" already_selected: "Este projeto já está selecionado" remove: "Remover definições do projeto" - password_confirmation: - field_description: "Tem que digitar a sua palavra-passe para confirmar esta alteração." - title: "Confirme a sua palavra-passe para continuar" pagination: no_other_page: "Mais nenhuma página a apresentar." pages_skipped: "Páginas saltadas." diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index db5bc4f859b..16b185d9890 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -633,9 +633,6 @@ ro: add: "Adaugă o setare pentru proiect" already_selected: "Acest proiect este deja selectat" remove: "Elimină setările proiectului" - password_confirmation: - field_description: "Trebuie să introduci parola contului tău pentru a confirma această schimbare." - title: "Te rog să confirmi parola pentru a continua" pagination: no_other_page: "Ești pe singura pagină." pages_skipped: "Pagini sărite." diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index a8e842e28d9..9a21927c4a5 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -634,9 +634,6 @@ ru: add: "Добавить настройку для проекта" already_selected: "Этот проект уже выбран" remove: "Удалить настройки проекта" - password_confirmation: - field_description: "Чтобы подтвердить изменения, введите пароль учетной записи." - title: "Для продолжения введите свой пароль" pagination: no_other_page: "Вы находитесь на единственной странице." pages_skipped: "Страницы пропущены." diff --git a/config/locales/crowdin/js-rw.yml b/config/locales/crowdin/js-rw.yml index 179ec6587ad..d9c83929d7a 100644 --- a/config/locales/crowdin/js-rw.yml +++ b/config/locales/crowdin/js-rw.yml @@ -633,9 +633,6 @@ rw: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-si.yml b/config/locales/crowdin/js-si.yml index 20e2840ef44..c71ea3cae9e 100644 --- a/config/locales/crowdin/js-si.yml +++ b/config/locales/crowdin/js-si.yml @@ -633,9 +633,6 @@ si: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "මෙම වෙනස තහවුරු කිරීම සඳහා ඔබගේ ගිණුමේ මුරපදය ඇතුළත් කළ යුතුය." - title: "දිගටම කරගෙන යාමට ඔබගේ මුරපදය තහවුරු කරන්න" pagination: no_other_page: "ඔබ සිටින්නේ එකම පිටුවේ ය." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-sk.yml b/config/locales/crowdin/js-sk.yml index ea04cd09bee..6b45ff13b77 100644 --- a/config/locales/crowdin/js-sk.yml +++ b/config/locales/crowdin/js-sk.yml @@ -635,9 +635,6 @@ sk: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Ak chcete potvrdiť túto zmenu, musíte zadať heslo svojho účtu." - title: "Ak chcete pokračovať, potvrďte svoje heslo" pagination: no_other_page: "Ste na jedinej stránke." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-sl.yml b/config/locales/crowdin/js-sl.yml index 65eb6a058fe..9d834947e38 100644 --- a/config/locales/crowdin/js-sl.yml +++ b/config/locales/crowdin/js-sl.yml @@ -634,9 +634,6 @@ sl: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "Prosimo vnesite svoje uporabniško geslo za potrditev te spremembe. " - title: "Potrdite svoje geslo za nadaljevanje" pagination: no_other_page: "Ste na edini strani. " pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-sr.yml b/config/locales/crowdin/js-sr.yml index 4926d2223f4..96ee05f4584 100644 --- a/config/locales/crowdin/js-sr.yml +++ b/config/locales/crowdin/js-sr.yml @@ -634,9 +634,6 @@ sr: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml index 0b11235b45a..a18453e1066 100644 --- a/config/locales/crowdin/js-sv.yml +++ b/config/locales/crowdin/js-sv.yml @@ -632,9 +632,6 @@ sv: add: "Lägg till inställning för projekt" already_selected: "Detta projekt är redan valt" remove: "Ta bort projektinställningar" - password_confirmation: - field_description: "Du behöver ange ditt lösenord för att bekräfta ändringen." - title: "Bekräfta ditt lösenord för att fortsätta" pagination: no_other_page: "Du befinner dig på den enda sidan." pages_skipped: "Sidor överhoppade." diff --git a/config/locales/crowdin/js-th.yml b/config/locales/crowdin/js-th.yml index 55461157b11..5a74fda6d40 100644 --- a/config/locales/crowdin/js-th.yml +++ b/config/locales/crowdin/js-th.yml @@ -632,9 +632,6 @@ th: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml index 5f37b294e56..d3ffbfb40bf 100644 --- a/config/locales/crowdin/js-tr.yml +++ b/config/locales/crowdin/js-tr.yml @@ -154,7 +154,7 @@ tr: attribute_reference: macro_help_tooltip: "Bu metin parçası bir makro tarafından dinamik olarak işleniyor." not_found: "İstenen kaynak bulunamadı" - nested_macro: "This macro is recursively referencing %{model} %{id}." + nested_macro: "Bu makro özyinelemeli olarak %{model} %{id}adresine referans verir." invalid_attribute: "Seçilen '%{name}' özniteliği mevcut değil." child_pages: button: "Alt sayfalara bağlantılar" @@ -203,8 +203,8 @@ tr: add_table: "Bağlantılı iş paketlerinin tablosunu ekle" edit_query: "Sorguyu düzenle" new_group: "Yeni grup" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Grubu Sil" + remove_attribute: "Gruptan çıkar" reset_to_defaults: "Varsayılanlara geri yükle" working_days: calendar: @@ -218,13 +218,13 @@ tr: removed_title: "Aşağıdaki günleri çalışılmayan günler listesinden çıkaracaksınız:" change_description: "Haftanın hangi günlerinin iş günü veya iş günü olmayan günler olarak kabul edileceğinin değiştirilmesi, bu sistemdeki tüm projelerdeki tüm iş paketlerinin ve yaşam döngülerinin başlangıç ve bitiş günlerini etkileyebilir." warning: > - The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated. - Are you sure you want to continue? + Değişikliklerin yürürlüğe girmesi biraz zaman alabilir. İlgili tüm iş paketleri ve proje yaşam döngüleri güncellendiğinde size bildirilecektir. + Devam etmek istediğinizden emin misiniz? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- - Changing progress calculation mode from status-based to work-based will make the % Complete field freely editable. If you optionally enter values for Work or Remaining work, they will also be linked to % Complete. Changing Remaining work can then update % Complete. + İlerleme hesaplama modunu durum bazlıdan iş bazlıya değiştirmek % Tamamlandı alanını serbestçe düzenlenebilir hale getirecektir. İş veya Kalan iş için isteğe bağlı olarak değerler girerseniz, bunlar da % Tamamlandı ile bağlantılı olacaktır. Kalan işin değiştirilmesi % Tamamlanan'ı güncelleyebilir. warning_progress_calculation_mode_change_from_field_to_status_html: >- - Changing progress calculation mode from work-based to status-based will result in all existing % Complete values to be lost and replaced with values associated with each status. Existing values for Remaining work may also be recalculated to reflect this change. This action is not reversible. + İlerleme hesaplama modunun iş bazlıdan durum bazlıya değiştirilmesi, mevcut tüm % Tamamlandı değerlerinin kaybolmasına ve her bir durumla ilişkili değerlerle değiştirilmesine neden olacaktır. Kalan iş için mevcut değerler de bu değişikliği yansıtacak şekilde yeniden hesaplanabilir. Bu eylem geri döndürülemez. custom_actions: date: specific: "tarihinde" @@ -295,17 +295,17 @@ tr: ical_sharing_modal: title: "Takvime abone ol" inital_setup_error_message: "Veri alınırken bir hata oluştu." - description: "You can use the URL (iCalendar) to subscribe to this calendar in an external client and view up-to-date work package information from there." + description: "Harici bir istemcide bu takvime abone olmak için URL'yi (iCalendar) kullanabilir ve güncel iş paketi bilgilerini buradan görüntüleyebilirsiniz." warning: "Bu adresi başkalarıyla paylaşmayın. Bu adrese sahip olan birisi iş paketini hesabı ya da parolası olmaksızın görüntüleyebilecektir." token_name_label: "Bunu nerede kullanacaksınız?" token_name_placeholder: 'Bir ad yazın, örneğin "Telefon"' - token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your access tokens list.' + token_name_description_text: 'Bu takvime birden fazla cihazdan abone olursanız, bu ad erişim belirteçleri listenizde bunlar arasında ayrım yapmanıza yardımcı olacaktır.' copy_url_label: "Adresi kopyala" ical_generation_error_text: "Takvim adresi üretilirken bir hata oldu." success_message: '"%{name}" adresi başarıyla panonuza koplandı. Aboneliği tamamlamak için takvim istemcinize yapıştırın.' label_activate: "Etkinleştir" label_assignee: "Atanan" - label_assignee_alt_text: "This work package is assigned to %{name}" + label_assignee_alt_text: "Bu iş paketi %{name} ne atanmıştır." label_add_column_after: "Sonrasına sütun ekle" label_add_column_before: "Öncesine sütun ekle" label_add_columns: "Sütunlar ekle" @@ -347,7 +347,7 @@ tr: label_collapse: "Daralt" label_collapsed: "daraltılmış" label_collapse_all: "Tümünü daralt" - label_collapse_text: "Collapse text" + label_collapse_text: "Metni daralt" label_comment: "Yorum" label_committed_at: "%{committed_revision_link} %{date}" label_committed_link: "kaydedilmiş revizyon %{revision_identifier}" @@ -360,7 +360,7 @@ tr: label_expand: "Genişlet" label_expanded: "genişletilmiş" label_expand_all: "Tümünü genişlet" - label_expand_text: "Show full text" + label_expand_text: "Tam metni göster" label_expand_project_menu: "Proje menüsünü genişlet" label_export: "Dışarı aktar" label_export_preparing: "İhracat hazırlanıyor ve kısa süre içinde indirilecek." @@ -426,7 +426,7 @@ tr: label_remove_row: "Satırı kaldır" label_report: "Rapor" label_repository_plural: "Depolar" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Proje menüsünü yeniden boyutlandır" label_save_as: "Farklı Kaydet" label_search_columns: "Bir sütunda arama yap" label_select_watcher: "Takipçi seç..." @@ -464,7 +464,7 @@ tr: label_work_package_plural: "İş paketleri" label_watch: "Takip et" label_watch_work_package: "İş paketini takip et" - label_watcher_added_successfully: "Takipçi başarıyla eklendi!" + label_watcher_added_successfully: "Gözlemci başarıyla eklendi!" label_watcher_deleted_successfully: "Takipçi başarıyla silindi!" label_work_package_details_you_are_here: "%{type} %{subject} için %{tab} sekmesindesiniz." label_work_package_context_menu: "İş paketi bağlam menüsü" @@ -558,7 +558,7 @@ tr: date_alerts: milestone_date: "Kilometre taşı tarihi" overdue: "Süresi geçmiş" - overdue_since: "for %{difference_in_days}." + overdue_since: "%{difference_in_days} içinde." property_today: "bugün." property_is: "%{difference_in_days} içinde." property_was: "%{difference_in_days} önce idi." @@ -573,7 +573,7 @@ tr: with_current_filter: "Şu anda bu görünümde bildirim yok" mark_all_read: "Tümünü okundu olarak işaretle" mark_as_read: "Okundu olarak işaretle" - mark_all_read_confirmation: "This will mark all notifications in this view as read. Are you sure you want to do this?" + mark_all_read_confirmation: "Bu, bu görünümdeki tüm bildirimleri okundu olarak işaretleyecektir. Bunu yapmak istediğinizden emin misiniz?" text_update_date_by: "%{date} tarafından" total_count_warning: "En yeni %{newest_count} bildirim gösteriliyor. %{more_count} tane daha görüntülenmiyor." empty_state: @@ -633,9 +633,6 @@ tr: add: "Proje için ayar ekle" already_selected: "Bu proje zaten seçildi" remove: "Proje ayarlarını kaldır" - password_confirmation: - field_description: "Bu değişikliği onaylamak için hesap parolanızı girmeniz gerekir." - title: "Devam etmek için parolanızı doğrulayın" pagination: no_other_page: "Geçerli tek sayfadasınız." pages_skipped: "Sayfalar atlandı." @@ -692,7 +689,7 @@ tr: last_day: "Son gün" text_are_you_sure: "Emin misiniz?" text_are_you_sure_to_cancel: "Bu sayfada kaydedilmemiş değişiklikleriniz var. Bunları atmak istediğinizden emin misiniz?" - breadcrumb: "Breadcrumb" + breadcrumb: "Gezinti Menüsü" text_data_lost: "Girilen tüm veriler silinecek." text_user_wrote: "%{value} demiş ki:" types: @@ -766,8 +763,8 @@ tr: toggle_description: "İlişki açıklamasını göster" update_relation: "İlişki türünü değiştirmek için tıklayın" show_relations: "İlişkileri göster" - add_predecessor: "Öncelik ekle" - add_successor: "Yedek personel ekle" + add_predecessor: "Ekle (Öncül)" + add_successor: "Ardıl görev ekle" remove: "İlişkiyi kaldır" save: "İlişkiyi kaydet" abort: "İptal" @@ -854,14 +851,14 @@ tr: progress: title: "İş tahminleri ve ilerleme" baseline: - addition_label: "Added to view within the comparison time period" - removal_label: "Removed from view within the comparison time period" - modification_label: "Modified within the comparison time period" - column_incompatible: "This column does not show changes in Baseline mode." + addition_label: "Karşılaştırma süresi içinde görüntülenmek üzere eklendi" + removal_label: "Karşılaştırma süresi içinde görünümden kaldırıldı" + modification_label: "Karşılaştırma dönemi içinde değiştirildi" + column_incompatible: "Bu sütun Temel moddaki değişiklikleri göstermez." filters: title: "İş paketlerini filtrele" - baseline_incompatible: "This filter attribute is not taken into consideration in Baseline mode." - baseline_warning: "Baseline mode is on but some of your active filters are not included in the comparison." + baseline_incompatible: "Bu filtre özelliği Temel modda dikkate alınmaz." + baseline_warning: "Baseline modu açık ancak aktif filtrelerinizden bazıları karşılaştırmaya dahil edilmiyor." inline_create: title: "Listeden yeni bir iş paketi eklemek için buraya tıklayınız" create: @@ -993,7 +990,7 @@ tr: button: "Bu iş paketi tablosunu yapılandır" choose_display_mode: "İş paketlerini farklı olarak göster" modal_title: "İş paketi tablosu yapılandırma" - embedded_tab_disabled: "This configuration tab is not available for the embedded view you are editing." + embedded_tab_disabled: "Bu yapılandırma sekmesi, düzenlemekte olduğunuz gömülü görünüm için kullanılamaz." default: "varsayılan" display_settings: "Görünüm ayarları" default_mode: "Düz liste" @@ -1075,7 +1072,7 @@ tr: notice_successful_delete: "Silme başarılı." notice_successful_update: "Güncelleme başarılı." notice_job_started: "görev başlatıldı." - no_job_id: "No job ID returned from server." + no_job_id: "Sunucudan dönen iş kimliği yok." invalid_job_response: "Sunucudan geçersiz yanıt." notice_bad_request: "Hatalı istek." relations: @@ -1127,12 +1124,12 @@ tr: global_search: all_projects: "Tüm projelerde" close_search: "Aramayı kapat" - items_available: "%{count} items available" - direct_hit_available: "Work package with exact ID found. Press Enter to open it." + items_available: "%{count} mevcut ürün" + direct_hit_available: "Tam kimliğe sahip iş paketi bulundu. Açmak için Enter tuşuna basın." current_project_and_all_descendants: "Bu projede + alt projelerde" current_project: "Bu projede" recently_viewed: "Son görüntülenenler" - search_placeholder_expanded: "Search work packages by subject, project, type, status or ID" + search_placeholder_expanded: "İş paketlerini konu, proje, tür, durum veya kimliğe göre arama" title: all_projects: "tüm projeler" project_and_subprojects: "ve tüm alt projeler" @@ -1143,12 +1140,12 @@ tr: timeline: "Gantt" invite_user_modal: invite: "Davet et" - placeholder_add_tag: "Create placeholder user" + placeholder_add_tag: "Geçici (placeholder) kullanıcı oluştur" exclusion_info: modal: - title: "Status excluded from hierarchy totals" + title: "Hiyerarşi toplamlarından hariç tutulan durum" content: >- - The status '%{status_name}' has been configured to be excluded from hierarchy totals of Work, Remaining work, and % Complete. The totals do not take this value into account. + '%{status_name}' durumu, İş, Kalan iş ve % Tamamlandı hiyerarşi toplamlarından hariç tutulacak şekilde yapılandırılmıştır. Toplamlar bu değeri dikkate almaz. favorite_projects: no_results: "Favori projeniz yok" no_results_subtext: "Bir veya birden fazla projeyi genel bakışları veya proje listesi aracılığıyla favori olarak ekleyin." @@ -1170,10 +1167,10 @@ tr: no_results: "Arama kriterleriniz ile eşleşen proje yok" no_favorite_results: "Arama kriterleriniz ile eşleşen favori proje yok." include_workspaces: - search_placeholder: "Search..." + search_placeholder: "Arama..." types: program: "Program" - portfolio: "Portfolio" + portfolio: "Portföy" baseline: toggle_title: "Referens Zamanı" clear: "Temizle" @@ -1201,8 +1198,8 @@ tr: maintained_with_changes: "Değişikliklerle sürdürüldü" in_your_timezone: "Yerel saat diliminizde:" icon_tooltip: - added: "Added to view within the comparison time period" - removed: "Removed from view within the comparison time period" + added: "Karşılaştırma süresi içinde görüntülenmek üzere eklendi" + removed: "Karşılaştırma süresi içinde görünümden kaldırıldı" changed: "Değişiklikler ile sürdürüldü" forms: submit_success_message: "Form başarıyla gönderildi" diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml index c12a8e710be..5d623bf7906 100644 --- a/config/locales/crowdin/js-uk.yml +++ b/config/locales/crowdin/js-uk.yml @@ -203,8 +203,8 @@ uk: add_table: "Додати таблицю пов'язаних пакетів робіт" edit_query: "Редагувати запит" new_group: "Нова група" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Видалити групу" + remove_attribute: "Вилучити з групи" reset_to_defaults: "Скинути на типові значення" working_days: calendar: @@ -426,7 +426,7 @@ uk: label_remove_row: "Видалити рядок" label_report: "Звіт" label_repository_plural: "Репозиторії" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "Змінити розмір меню проєкту" label_save_as: "Зберегти як" label_search_columns: "Пошук стовпця" label_select_watcher: "Виберіть спостерігача..." @@ -635,9 +635,6 @@ uk: add: "Додати налаштування для проєкту" already_selected: "Цей проєкт уже вибрано" remove: "Вилучити налаштування проєкту" - password_confirmation: - field_description: "Вам необхідно ввести пароль облікового запису, щоб підтвердити цю зміну." - title: "Підтвердіть ваш пароль щоб продовжити" pagination: no_other_page: "Ви знаходитесь на єдиній сторінці." pages_skipped: "Сторінки пропущено." diff --git a/config/locales/crowdin/js-uz.yml b/config/locales/crowdin/js-uz.yml index bae8ec73bd8..135693a2257 100644 --- a/config/locales/crowdin/js-uz.yml +++ b/config/locales/crowdin/js-uz.yml @@ -633,9 +633,6 @@ uz: add: "Add setting for project" already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index 1c215b57ce4..8be53ce498e 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -26,12 +26,12 @@ vi: loading: "Đang tải…" updating: "Đang cập nhật…" attachments: - delete: "Xóa tập tin đính kèm" + delete: "Xóa tệp đính kèm" delete_confirmation: | - Bạn có chắc chắn muốn xóa tập tin này không? Hành động này không thể hoàn tác. + Bạn có chắc chắn muốn xóa tập tin này? Hành động này không thể đảo ngược. draggable_hint: | - Kéo trên trường được soạn thảo để chèn ảnh hoặc file đính kèm. Trường soạn thảo đang được đóng sẽ được mở lại khi bạn kéo thả. - quarantined_hint: "Tập tin đã bị cách ly do phát hiện virus. Nó không khả dụng để tải xuống." + Kéo trường soạn thảo vào hình ảnh nội tuyến hoặc tệp đính kèm tham chiếu. Các trường soạn thảo đã đóng sẽ được mở trong khi bạn tiếp tục kéo. + quarantined_hint: "Tệp đã được cách ly vì đã tìm thấy vi-rút. Nó không có sẵn để tải về." autocomplete_ng_select: add_tag: "Thêm mục" clear_all: "Xóa tất cả" @@ -45,52 +45,52 @@ vi: remove: "Xoá %{name}" active: "Kích hoạt %{label} %{name}" backup: - attachments_disabled: Các tệp đính kèm có thể không được thêm vào vì chúng vượt quá kích thước tối đa được phép. Bạn có thể thay đổi điều này thông qua cấu hình (yêu cầu khởi động lại máy chủ). + attachments_disabled: Tệp đính kèm có thể không được đưa vào vì chúng vượt quá kích thước tổng thể tối đa cho phép. Bạn có thể thay đổi điều này thông qua cấu hình (yêu cầu khởi động lại máy chủ). info: > - Bạn có thể kích hoạt một bản sao lưu ở đây. Quá trình có thể mất một chút thời gian tùy thuộc vào lượng dữ liệu (đặc biệt là tệp đính kèm) bạn có. Bạn sẽ nhận được một email sau khi nó sẵn sàng. + Bạn có thể kích hoạt một bản sao lưu ở đây. Quá trình này có thể mất một chút thời gian tùy thuộc vào lượng dữ liệu (đặc biệt là tệp đính kèm) mà bạn có. Bạn sẽ nhận được email khi nó đã sẵn sàng. note: > - Một bản sao lưu mới sẽ ghi đè cái trước đó. Số lượng bản sao lưu mỗi ngày là bị hạn chế. - last_backup: Sao lưu gần đây - last_backup_from: Sao lưu gần đây nhất từ - title: Sao lưu OpenProject - options: Tuỳ chọn - include_attachments: Bao gồm các tệp đính kèm + Bản sao lưu mới sẽ ghi đè lên bất kỳ bản sao lưu nào trước đó. Chỉ có thể yêu cầu một số lượng bản sao lưu giới hạn mỗi ngày. + last_backup: Sao lưu lần cuối + last_backup_from: Sao lưu lần cuối từ + title: Sao lưu dự án mở + options: tùy chọn + include_attachments: Bao gồm tệp đính kèm download_backup: Tải xuống bản sao lưu request_backup: Yêu cầu sao lưu - close_popup_title: "Đóng" + close_popup_title: "Đóng cửa sổ bật lên" close_filter_title: "Đóng bộ lọc" close_form_title: "Đóng biểu mẫu" button_add_watcher: "Thêm người theo dõi" button_add: "Thêm" button_back: "Quay lại" button_back_to_list_view: "Quay lại danh sách" - button_cancel: "Hủy" + button_cancel: "Hủy bỏ" button_close: "Đóng" button_change_project: "Chuyển sang dự án khác" - button_check_all: "Đánh dấu tất cả" - button_configure-form: "Cấu hình biểu mẫu" + button_check_all: "Kiểm tra tất cả" + button_configure-form: "Định cấu hình biểu mẫu" button_confirm: "Xác nhận" - button_continue: "Tiếp tục" - button_copy: "Sao chép" - button_copy_to_clipboard: "Sao chép vào bảng tạm" + button_continue: "tiếp tục" + button_copy: "sao chép" + button_copy_to_clipboard: "Sao chép vào khay nhớ tạm" button_copy_link_to_clipboard: "Sao chép liên kết vào bảng tạm" - button_copy_to_other_project: "Sao chép trong một dự án khác" + button_copy_to_other_project: "Trùng lặp trong một dự án khác" button_custom-fields: "Tùy chỉnh mục" - button_delete: "Xoá" + button_delete: "xóa" button_delete_watcher: "Xóa người xem" button_details_view: "Thông tin chi tiết xem" - button_duplicate: "Nhân đôi" + button_duplicate: "trùng lặp" button_edit: "Chỉnh sửa" - button_filter: "Bộ lọc" + button_filter: "bộ lọc" button_collapse_all: "Thu gọn tất cả" button_expand_all: "Mở rộng tất cả" button_advanced_filter: "Bộ lọc nâng cao" button_list_view: "Xem kiểu danh sách" button_show_view: "Xem toàn màn hình" - button_log_time: "Thời gian truy cập" - button_start_timer: "Start timer" - button_stop_timer: "Stop timer" - button_more: "Xem thêm" + button_log_time: "Đăng nhập thời gian" + button_start_timer: "Bắt đầu hẹn giờ" + button_stop_timer: "Dừng hẹn giờ" + button_more: "hơn thế nữa" button_open_details: "Mở thông tin chi tiết xem" button_close_details: "Đóng xem chi tiết" button_open_fullscreen: "Mở chế độ toàn màn hình" @@ -99,14 +99,14 @@ vi: button_show_table: "Hiển thị chế độ xem bảng" button_show_gantt: "Hiển thị chế độ xem Gantt" button_show_fullscreen: "Hiển thị chế độ xem toàn màn hình" - button_more_actions: "Thao tác thêm" - button_quote: "Trích dẫn" - button_save: "Lưu" - button_settings: "Cài đặt" + button_more_actions: "Thêm hành động" + button_quote: "trích dẫn" + button_save: "lưu lại" + button_settings: "cài đặt" button_uncheck_all: "Bỏ chọn tất cả" - button_update: "Cập Nhật" - button_export-atom: "Tải về Atom" - button_generate_pdf: "Generate PDF" + button_update: "cập nhật" + button_export-atom: "Tải xuống nguyên tử" + button_generate_pdf: "Tạo PDF" button_create: "Tạo mới" card: add_new: "Thêm thẻ mới" @@ -114,138 +114,139 @@ vi: inline: "Đánh dấu nội tuyến:" entire_card_by: "Toàn bộ thẻ của" remove_from_list: "Xóa thẻ khỏi danh sách" - caption_rate_history: "Lịch sử tỷ lệ" + caption_rate_history: "Lịch sử giá" clipboard: browser_error: "Trình duyệt của bạn không hỗ trợ sao chép vào clipboard. Vui lòng sao chép thủ công: %{content}" - copied_successful: "Sao chép vào clipboard thành công!" + copied_successful: "Đã sao chép thành công vào clipboard!" chart: type: "Kiểu đồ thị" axis_criteria: "Tiêu chí trục" - modal_title: "Bảng cấu hình công việc" + modal_title: "Cấu hình biểu đồ gói công việc" types: - line: "Dòng" - horizontal_bar: "Cột ngang" - bar: "Thanh" - pie: "Biểu đồ tròn" - doughnut: "Bánh vòng" - radar: "Ra đa" + line: "dòng" + horizontal_bar: "Thanh ngang" + bar: "thanh" + pie: "bánh" + doughnut: "bánh rán" + radar: "ra đa" polar_area: "Vùng cực" tabs: - graph_settings: "Tổng quan" - dataset: "Tập dữ liệu %{number}" + graph_settings: "chung" + dataset: "Bộ dữ liệu %{number}" errors: - could_not_load: "Dữ liệu để hiển thị biểu đồ không thể được tải. Có thể thiếu quyền cần thiết." + could_not_load: "Không thể tải dữ liệu để hiển thị biểu đồ. Các quyền cần thiết có thể bị thiếu." description_available_columns: "Cột có sẵn" description_current_position: "Bạn đang ở đây:" - description_select_work_package: "Chọn work package #%{id}" - description_subwork_package: "Con của work package #%{id}" + description_select_work_package: "Chọn gói công việc #%{id}" + description_subwork_package: "Gói công việc con #%{id}" editor: revisions: "Hiển thị các sửa đổi cục bộ" no_revisions: "Không tìm thấy sửa đổi cục bộ" preview: "Bật tắt chế độ xem trước" - source_code: "Chuyển đổi chế độ mã Markdown" + source_code: "Chuyển đổi chế độ nguồn Markdown" error_saving_failed: "Lưu tài liệu không thành công với lỗi sau: %{error}" ckeditor_error: "Đã xảy ra lỗi trong CKEditor" mode: - manual: "Chuyển sang mã Markdown" - wysiwyg: "Chuyển sang trình chỉnh sửa WYSIWYG" + manual: "Chuyển sang nguồn Markdown" + wysiwyg: "Chuyển sang trình soạn thảo WYSIWYG" macro: error: "Không thể mở rộng macro: %{message}" attribute_reference: - macro_help_tooltip: "Đoạn văn bản này đang được hiển thị động bởi macro." - not_found: "Tài nguyên yêu cầu không thể được tìm thấy" + macro_help_tooltip: "Đoạn văn bản này đang được macro hiển thị động." + not_found: "Không thể tìm thấy tài nguyên được yêu cầu" nested_macro: "Macro này đang tham chiếu đệ quy %{model} %{id}." - invalid_attribute: "Thuộc tính '%{name}' đã chọn không tồn tại." + invalid_attribute: "Thuộc tính đã chọn '%{name}' không tồn tại." child_pages: button: "Liên kết đến trang con" - include_parent: "Bao gồm trang trước" - text: "[Placeholder] Liên kết tới trang con của" - page: "Trang wiki" + include_parent: "Bao gồm cha mẹ" + text: "[Placeholder] Liên kết tới các trang con của" + page: "trang Wiki" this_page: "trang này" hint: | - Để trường này rỗng đẻ liệt kêtất cả các trang con của trang hiện tại. Nếu bạn muốn tham chiếu đến một trang khác, hãy cung cấp tiêu đề hoặc lời bình của trang. + Để trống trường này để liệt kê tất cả các trang con của trang hiện tại. Nếu bạn muốn tham khảo một trang khác, hãy cung cấp tiêu đề hoặc phần mở rộng của trang đó. code_block: button: "Chèn đoạn mã" - title: "Insert / sửa đoạn mã" + title: "Chèn/sửa đoạn mã" language: "Định dạng ngôn ngữ" - language_hint: "Nhập ngôn ngữ định dạng sẽ được sử dụng để làm nổi bật (nếu được hỗ trợ)." + language_hint: "Nhập ngôn ngữ định dạng sẽ được sử dụng để đánh dấu (nếu được hỗ trợ)." dropdown: macros: "Macro" - chose_macro: "Chọn macro" + chose_macro: "Chọn vĩ mô" toc: "Mục lục" - toolbar_help: "Bấm vào để chọn tiện ích và hiển thị thanh công cụ. Bấm đúp để chỉnh sửa tiện ích" + toolbar_help: "Bấm để chọn widget và hiển thị thanh công cụ. Nhấp đúp để chỉnh sửa tiện ích" wiki_page_include: button: "Bao gồm các nội dung của một trang wiki khác" - text: "[Placeholder] bao gồm trang wiki của" - page: "Trang wiki" + text: "[Placeholder] Bao gồm trang wiki của" + page: "trang Wiki" not_set: "(Trang chưa được thiết lập)" hint: | - Bao gồm các nội dung của các trang wiki khác bằng cách xác định các tiêu đề hoặc bình luận. Bạn có thể bao gồm các trang wiki của dự án khác bằng cách tách chúng với một dấu phẩy như ví dụ sau. + Bao gồm nội dung của một trang wiki khác bằng cách chỉ định tiêu đề hoặc phần mở rộng của nó. + Bạn có thể bao gồm trang wiki của một dự án khác bằng cách phân tách chúng bằng dấu hai chấm như ví dụ sau. work_package_button: - button: "Chèn nút tạo gói" - type: "Kiểu của gói công việc" + button: "Chèn nút tạo gói công việc" + type: "Loại gói công việc" button_style: "Sử dụng kiểu nút" - button_style_hint: "Tùy chọn: Kiểm tra xem macro xuất hiện như là một nút, chứ không phải là một liên kết." - without_type: "Work package liên quan" - with_type: "Tạo gói công việc (loại: %{typename})" + button_style_hint: "Tùy chọn: Chọn để làm cho macro xuất hiện dưới dạng nút chứ không phải dưới dạng liên kết." + without_type: "Tạo gói công việc" + with_type: "Tạo gói công việc (Loại: %{typename})" embedded_table: - button: "Nhúng danh sách gói công việc dưới dạng bảng" - text: "[Placeholder] gói công việc nhúng" + button: "Nhúng bảng gói công việc" + text: "[Placeholder] Bảng gói công việc được nhúng" embedded_calendar: - text: "[Placeholder] Lịch đã nhúng" + text: "[Placeholder] Lịch nhúng" admin: type_form: custom_field: "Tùy chỉnh mục" inactive: "Không hoạt động" drag_to_activate: "Kéo các trường từ đây để kích hoạt chúng" add_group: "Thêm 1 nhóm thuộc tính" - add_table: "Thêm bảng các công việc liên quan" + add_table: "Thêm bảng các gói công việc liên quan" edit_query: "Chỉnh sửa truy vấn" new_group: "Nhóm mới" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "Xóa nhóm" + remove_attribute: "Xóa khỏi nhóm" reset_to_defaults: "Đặt lại về mặc định" working_days: calendar: - empty_state_header: "Ngày không làm việc" - empty_state_description: 'Không có ngày không làm việc cụ thể nào được định nghĩa cho năm nay. Nhấp vào "+ Ngày không làm việc" bên dưới để thêm ngày.' + empty_state_header: "Những ngày không làm việc" + empty_state_description: 'Không có ngày không làm việc cụ thể nào được xác định cho năm nay. Bấm vào "+ Ngày không làm việc" bên dưới để thêm ngày.' new_date: "(mới)" add_non_working_day: "Ngày không làm việc" - already_added_error: "Một ngày không làm việc cho ngày này đã tồn tại. Chỉ có thể tạo một ngày không làm việc cho mỗi ngày duy nhất." + already_added_error: "Ngày không làm việc cho ngày này đã tồn tại. Chỉ có thể có một ngày không làm việc được tạo cho mỗi ngày duy nhất." change_button: "Lưu và lên lịch lại" change_title: "Thay đổi ngày làm việc" - removed_title: "Bạn sẽ xóa các ngày sau khỏi danh sách ngày không làm việc:" - change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance." + removed_title: "Bạn sẽ xóa những ngày sau khỏi danh sách những ngày không làm việc:" + change_description: "Việc thay đổi ngày trong tuần được coi là ngày làm việc hay ngày không làm việc có thể ảnh hưởng đến ngày bắt đầu và ngày kết thúc của tất cả các gói công việc và vòng đời trong tất cả các dự án trong trường hợp này." warning: > - The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated. - Are you sure you want to continue? + Những thay đổi có thể mất một thời gian để có hiệu lực. Bạn sẽ được thông báo khi tất cả các gói công việc có liên quan và vòng đời dự án đã được cập nhật. + Bạn có chắc chắn muốn tiếp tục không? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- - Thay đổi chế độ tính toán tiến độ từ dựa trên trạng thái sang dựa trên công việc sẽ làm cho trường % Hoàn thành có thể chỉnh sửa tự do. Nếu bạn tùy ý nhập giá trị cho Công việc hoặc Công việc còn lại, chúng cũng sẽ được liên kết với % Hoàn thành. Thay đổi Công việc còn lại sau đó có thể cập nhật % Hoàn thành. + Việc thay đổi chế độ tính toán tiến độ từ dựa trên trạng thái sang dựa trên công việc sẽ làm cho trường % Hoàn thành có thể chỉnh sửa tự do. Nếu bạn tùy ý nhập các giá trị cho Work hoặc Công việc còn lại, thì chúng cũng sẽ được liên kết với % Hoàn thành. Việc thay đổi Công việc còn lại sau đó có thể cập nhật % Hoàn thành. warning_progress_calculation_mode_change_from_field_to_status_html: >- - Thay đổi chế độ tính toán tiến độ từ dựa trên công việc sang dựa trên trạng thái sẽ dẫn đến việc tất cả các giá trị hiện tại của % Hoàn thành bị mất và thay thế bằng các giá trị liên kết với từng trạng thái. Các giá trị hiện tại cho Công việc còn lại cũng có thể được tính lại để phản ánh sự thay đổi này. Hành động này không thể hoàn tác. + Việc thay đổi chế độ tính toán tiến độ từ dựa trên công việc sang dựa trên trạng thái sẽ khiến tất cả các giá trị % Hoàn thành hiện có bị mất và được thay thế bằng các giá trị được liên kết với từng trạng thái. Các giá trị hiện tại cho Công việc còn lại cũng có thể được tính toán lại để phản ánh sự thay đổi này. Hành động này không thể đảo ngược. custom_actions: date: - specific: "vào" + specific: "trên" current_date: "Ngày hiện tại" error: internal: "Lỗi nội bộ đã xảy ra." - cannot_save_changes_with_message: "Không thể lưu thay đổi của bạn do lỗi sau: %{error}" + cannot_save_changes_with_message: "Không thể lưu các thay đổi của bạn do lỗi sau: %{error}" query_saving: "Các tiêu chí không thể được lưu." - embedded_table_loading: "Không thể nạp được vùng nhìn nhúng: %{message}" + embedded_table_loading: "Không thể tải chế độ xem được nhúng: %{message}" enumeration_activities: "Hoạt động (theo dõi thời gian)" enumeration_doc_categories: "Danh mục tài liệu" enumeration_work_package_priorities: "Độ ưu tiên của work package" filter: - more_values_not_shown: "Có %{total} kết quả nữa, tìm kiếm để lọc kết quả." + more_values_not_shown: "Còn %{total} kết quả khác, tìm kiếm để lọc kết quả." description: - text_open_filter: "Mở bộ lọc này với 'ALT' và phím mũi tên." - text_close_filter: "Để nhập thôi ô đang kích hoạt nội dung Vd ấn enter. Nếu không muốn lọc lựa chọn mục rỗng đầu tiên." + text_open_filter: "Mở bộ lọc này bằng 'ALT' và các phím mũi tên." + text_close_filter: "Ví dụ: để chọn một mục, hãy để lại tiêu điểm bằng cách nhấn enter. Để thoát mà không có bộ lọc, hãy chọn mục nhập đầu tiên (trống)." noneElement: "(không có)" time_zone_converted: two_values: "%{from} - %{to} theo giờ địa phương của bạn." only_start: "Từ %{from} theo giờ địa phương của bạn." - only_end: "Đến %{to} theo giờ địa phương của bạn." + only_end: "Cho tới %{to} theo giờ địa phương của bạn." value_spacer: "-" sorting: criteria: @@ -253,63 +254,63 @@ vi: two: "Tiêu chí phân loại thứ hai" three: "Tiêu chí phân loại thứ ba" gantt_chart: - label: "Biểu đồ Gantt" + label: "biểu đồ Gantt" quarter_label: "Q%{quarter_number}" labels: title: "Cấu hình nhãn" bar: "Nhãn thanh" - left: "Trái" - right: "Phải" - farRight: "Xa phải" + left: "trái" + right: "đúng" + farRight: "Ngoài cùng bên phải" description: > - Chọn các thuộc tính bạn muốn hiển thị ở các vị trí tương ứng trên biểu đồ Gantt mọi lúc. Lưu ý rằng khi di chuột qua một phần tử, nhãn ngày của nó sẽ được hiển thị thay vì các thuộc tính này. + Chọn các thuộc tính bạn muốn hiển thị ở các vị trí tương ứng của biểu đồ Gantt mọi lúc. Lưu ý rằng khi di chuột qua một phần tử, nhãn ngày của phần tử đó sẽ được hiển thị thay vì các thuộc tính này. button_activate: "Xem biểu đồ sự kiện" button_deactivate: "Ân biểu đồ sự kiện" filter: noneSelection: "(không có)" selection_mode: - notification: "Nhấp vào bất kỳ gói công việc nào được làm nổi bật để tạo mối quan hệ. Nhấn escape để hủy bỏ." + notification: "Bấm vào bất kỳ gói công việc được đánh dấu nào để tạo mối quan hệ. Nhấn thoát để hủy." zoom: in: "Phóng to" out: "Thu nhỏ" - auto: "Tự động phóng to" - days: "Ngày" - weeks: "Tuần" + auto: "Tự động thu phóng" + days: "ngày" + weeks: "tuần" months: "Tháng" - quarters: "Quý" - years: "Năm" + quarters: "Khu" + years: "năm" description: > - Chọn mức phóng to ban đầu sẽ được hiển thị khi phóng tự động không có sẵn. + Chọn mức thu phóng ban đầu sẽ được hiển thị khi không có tính năng tự động thu phóng. general_text_no: "không" - general_text_yes: "có" - general_text_No: "Không" + general_text_yes: "Có" + general_text_No: "không" general_text_Yes: "Có" hal: error: update_conflict_refresh: "Nhấn vào đây để làm mới tài nguyên và cập nhật lên phiên bản mới nhất." - edit_prohibited: "Chỉnh sửa%{attribute} bị chặn đối với tài nguyên này. Thuộc tính này có nguồn gốc từ các mối quan hệ (ví dụ: trẻ em) hoặc mặt khác không thể định cấu hình." + edit_prohibited: "Chỉnh sửa %{attribute} bị chặn đối với tài nguyên này. Thuộc tính này có nguồn gốc từ các mối quan hệ (ví dụ: con) hoặc không thể cấu hình được." format: - date: "%{attribute} không phải là ngày hợp lệ - phải là YYYY-MM-DD." + date: "%{attribute} không có ngày hợp lệ - dự kiến ​​là YYYY-MM-DD." general: "Lỗi đã xảy ra." ical_sharing_modal: title: "Đăng ký lịch" - inital_setup_error_message: "Đã xảy ra lỗi khi lấy dữ liệu." - description: "Bạn có thể sử dụng URL (iCalendar) để đăng ký lịch này trong một ứng dụng bên ngoài và xem thông tin gói công việc cập nhật từ đó." - warning: "Vui lòng không chia sẻ URL này với người khác. Bất kỳ ai có liên kết này đều có thể xem chi tiết gói công việc mà không cần tài khoản hoặc mật khẩu." + inital_setup_error_message: "Đã xảy ra lỗi khi tìm nạp dữ liệu." + description: "Bạn có thể sử dụng URL (iCalendar) để đăng ký lịch này trong ứng dụng khách bên ngoài và xem thông tin cập nhật về gói công việc từ đó." + warning: "Vui lòng không chia sẻ URL này với người dùng khác. Bất kỳ ai có liên kết này đều có thể xem chi tiết gói công việc mà không cần có tài khoản hoặc mật khẩu." token_name_label: "Bạn sẽ sử dụng cái này ở đâu?" token_name_placeholder: 'Nhập tên, ví dụ: "Điện thoại"' - token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your access tokens list.' + token_name_description_text: 'Nếu bạn đăng ký lịch này từ nhiều thiết bị, tên này sẽ giúp bạn phân biệt giữa chúng trong danh sách token truy cập của mình.' copy_url_label: "Sao chép URL" ical_generation_error_text: "Đã xảy ra lỗi khi tạo URL lịch." - success_message: 'URL "%{name}" đã được sao chép thành công vào clipboard của bạn. Dán nó vào ứng dụng lịch của bạn để hoàn tất việc đăng ký.' - label_activate: "Kích hoạt" - label_assignee: "Người được giao" - label_assignee_alt_text: "This work package is assigned to %{name}" + success_message: 'URL "%{name}" đã được sao chép thành công vào khay nhớ tạm của bạn. Dán nó vào ứng dụng lịch của bạn để hoàn tất đăng ký.' + label_activate: "kích hoạt" + label_assignee: "Người được chuyển nhượng" + label_assignee_alt_text: "Gói công việc này được giao cho %{name}" label_add_column_after: "Thêm cột phía sau" label_add_column_before: "Thêm cột phía trước" label_add_columns: "Thêm cột" - label_add_comment: "Thêm bình luận" - label_add_comment_title: "Thêm bình luận và gõ @ để thông báo cho người khác" + label_add_comment: "Thêm nhận xét" + label_add_comment_title: "Bình luận và gõ @ để thông báo cho người khác" label_add_row_after: "Thêm dòng bên dưới" label_add_row_before: "Thêm dòng bên trên" label_add_selected_columns: "Thêm cột đang chọn" @@ -318,84 +319,84 @@ vi: label_ago: "vài ngày trước" label_all: "tất cả" label_all_projects: "Tất cả dự án" - label_all_uppercase: "Tất cả" + label_all_uppercase: "tất cả" label_all_work_packages: "Tất cả công việc" label_and: "và" - label_ascending: "Tăng dần" + label_ascending: "tăng dần" label_author: "Tác giả: %{user}" - label_avatar: "Ảnh đại diện" + label_avatar: "hình đại diện" label_between: "giữa" - label_board: "Bảng" - label_board_locked: "Đã khóa" - label_board_plural: "Bảng" - label_board_sticky: "Chú ý" - label_change: "Thay đổi" + label_board: "bảng" + label_board_locked: "bị khóa" + label_board_plural: "bảng" + label_board_sticky: "dính" + label_change: "thay đổi" label_create: "Tạo mới" label_create_work_package: "Tạo gói công việc mới" - label_created_by: "Được tạo bởi" + label_created_by: "Tạo bởi" label_current: "hiện tại" - label_date: "Ngày" - label_date_with_format: "Nhập vào %{date_attribute} bằng cách sử dụng định dạng sau: %{format}" - label_deactivate: "Tắt" + label_date: "ngày" + label_date_with_format: "Nhập %{date_attribute} bằng định dạng sau: %{format}" + label_deactivate: "Vô hiệu hóa" label_descending: "Giảm dần" - label_description: "Mô tả" - label_details: "Chi tiết" - label_display: "Hiển thị" - label_cancel_comment: "Hủy bình luận" - label_closed_work_packages: "đã đóng" + label_description: "mô tả" + label_details: "chi tiết" + label_display: "trưng bày" + label_cancel_comment: "Hủy nhận xét" + label_closed_work_packages: "đóng cửa" label_collapse: "Thu gọn" label_collapsed: "đóng" label_collapse_all: "Thu gọn tất cả" - label_collapse_text: "Collapse text" - label_comment: "Nhận xét" - label_committed_at: "%{committed_revision_link} lúc %{date}" - label_committed_link: "phiên bản commit %{revision_identifier}" + label_collapse_text: "Thu gọn văn bản" + label_comment: "bình luận" + label_committed_at: "%{committed_revision_link} tại %{date}" + label_committed_link: "cam kết sửa đổi %{revision_identifier}" label_contains: "bao gồm" - label_created_on: "tạo ngày" - label_edit_comment: "Chỉnh sửa chú thích này" + label_created_on: "được tạo trên" + label_edit_comment: "Chỉnh sửa nhận xét này" label_edit_status: "Trạng thái chỉnh sửa của nhóm công việc" - label_email: "Thư điện tử" + label_email: "email" label_equals: "là" label_expand: "Mở rộng" - label_expanded: "đã mở rộng" + label_expanded: "mở rộng" label_expand_all: "Mở rộng tất cả" - label_expand_text: "Show full text" + label_expand_text: "Hiển thị toàn văn" label_expand_project_menu: "Mở rộng menu dự án" - label_export: "Xuất" - label_export_preparing: "Quá trình xuất đang được chuẩn bị và sẽ được tải xuống ngay." - label_favorites: "Yêu thích" - label_filename: "Tệp" - label_filesize: "Kích cỡ" - label_general: "Tổng quan" + label_export: "xuất khẩu" + label_export_preparing: "Quá trình xuất đang được chuẩn bị và sẽ sớm được tải xuống." + label_favorites: "yêu thích" + label_filename: "tập tin" + label_filesize: "kích thước" + label_general: "chung" label_greater_or_equal: ">=" - label_group: "Nhóm" + label_group: "nhóm" label_group_by: "Nhóm theo" - label_group_plural: "Các Nhóm" + label_group_plural: "nhóm" label_hide_attributes: "Hiện ít hơn" label_hide_column: "Ẩn cột" label_hide_project_menu: "Thu gọn menu dự án" label_in: "trong" label_in_less_than: "ít hơn" - label_in_more_than: "nhiều hơn" + label_in_more_than: "trong hơn" label_incoming_emails: "Các thư đến" - label_information_plural: "Thông tin" - label_invalid: "Không hợp lệ" - label_import: "Nhập khẩu" + label_information_plural: "thông tin" + label_invalid: "không hợp lệ" + label_import: "nhập khẩu" label_latest_activity: "Hoạt động mới nhất" label_last_updated_on: "Cập nhật lần cuối lúc" label_learn_more_link: "Tìm hiểu thêm" label_less_or_equal: "<=" - label_less_than_ago: "ít hơn ngày trước" + label_less_than_ago: "chưa đầy ngày trước" label_loading: "Đang tải..." label_mail_notification: "Thông báo qua email" label_manage_columns: "Quản lý và sắp xếp lại các cột" label_me: "tôi" - label_meeting_agenda: "Chương trình nghị sự" - label_meeting_minutes: "Biên bản cuộc họp" + label_meeting_agenda: "chương trình họp" + label_meeting_minutes: "phút" label_more_than_ago: "nhiều hơn mấy ngày trước" - label_moderate_comment: "Moderate comment" + label_moderate_comment: "Kiểm duyệt bình luận" label_next: "Tiếp" - label_no_color: "Không màu" + label_no_color: "không có màu sắc" label_no_data: "Không có dữ liệu để hiển thị" label_no_due_date: "không có ngày kết thúc" label_no_start_date: "không có ngày bắt đầu" @@ -403,18 +404,18 @@ vi: label_no_value: "Không có giá trị" label_none: "không" label_not_contains: "không chứa" - label_not_equals: "không là" - label_on: "lúc" + label_not_equals: "không phải" + label_on: "trên" label_open_menu: "Mở trình đơn" label_open_context_menu: "Mở menu ngữ cảnh" label_open_work_packages: "mở" label_password: "Mật khẩu" - label_previous: "Trước đó" + label_previous: "trước đó" label_per_page: "Mỗi trang:" - label_please_wait: "Vui lòng chờ" - label_project: "Dự án" + label_please_wait: "Vui lòng chờ" + label_project: "dự án" label_project_list: "Danh sách dự án" - label_project_plural: "Các dự án" + label_project_plural: "dự án" label_visibility_settings: "Cài đặt hiển thị" label_quote_comment: "Trích bình luận này" label_recent: "Gần đây" @@ -424,167 +425,167 @@ vi: label_remove_columns: "Loại bỏ cột được chọn" label_remove_row: "Xóa hàng" label_report: "Báo cáo" - label_repository_plural: "Kho lưu trữ" - label_resize_project_menu: "Resize project menu" + label_repository_plural: "kho lưu trữ" + label_resize_project_menu: "Thay đổi kích thước menu dự án" label_save_as: "Lưu thành" - label_search_columns: "Tìm cột" + label_search_columns: "Tìm kiếm một cột" label_select_watcher: "Chọn một người theo dõi..." - label_selected_filter_list: "Các bộ lọc đã chọn: %s" + label_selected_filter_list: "Bộ lọc đã chọn" label_show_attributes: "Hiển thị tất cả các thuộc tính" label_show_in_menu: "Hiển thị chế độ xem trong menu" label_sort_by: "Sắp xếp theo" label_sorted_by: "sắp xếp theo" label_sort_higher: "Di chuyển lên" label_sort_lower: "Dịch xuống" - label_sorting: "Sắp xếp" - label_spent_time: "Thời gian" - label_star_query: "Favorited" + label_sorting: "sắp xếp" + label_spent_time: "dành thời gian" + label_star_query: "được yêu thích" label_press_enter_to_save: "Nhấn enter để lưu." - label_public_query: "Công cộng" - label_sum: "Tổng" - label_sum_for: "Tổng cho" - label_total_sum: "Tổng cộng" + label_public_query: "công khai" + label_sum: "tổng hợp" + label_sum_for: "Tổng hợp cho" + label_total_sum: "Tổng số tiền" label_subject: "Chủ đề" label_this_week: "tuần này" - label_today: "Hôm nay" - label_time_entry_plural: "Thời gian" - label_up: "Lên" - label_user_plural: "Người dùng" - label_activity_show_only_comments: "Hiển thị các hoạt động với các bình luận" + label_today: "hôm nay" + label_time_entry_plural: "dành thời gian" + label_up: "lên" + label_user_plural: "người dùng" + label_activity_show_only_comments: "Chỉ hiển thị các hoạt động có nhận xét" label_activity_show_all: "Hiển thị các hoạt động" label_total_progress: "%{percent}% Tổng tiến độ" - label_total_amount: "Tổng số tiền%{amount}" - label_updated_on: "cập Nhật ngày" - label_value_derived_from_children: "(giá trị lấy từ con)" - label_children_derived_duration: "Thời gian gói công việc được lấy từ các con" + label_total_amount: "Tổng cộng: %{amount}" + label_updated_on: "cập nhật trên" + label_value_derived_from_children: "(giá trị bắt nguồn từ trẻ em)" + label_children_derived_duration: "Thời lượng bắt nguồn của gói công việc con" label_warning: "Cảnh báo" label_work_package: "Work Package" - label_work_package_parent: "Gói công việc cha" - label_work_package_plural: "Work Packages" - label_watch: "Theo dõi" + label_work_package_parent: "Gói công việc của phụ huynh" + label_work_package_plural: "Gói công việc" + label_watch: "xem" label_watch_work_package: "Xem gói công việc" label_watcher_added_successfully: "Đã thêm nhận xét thành công." label_watcher_deleted_successfully: "Người theo dõi đã được xóa thành công!" label_work_package_details_you_are_here: "Bạn đang ở tab %{tab} cho %{type} %{subject}." label_work_package_context_menu: "Menu ngữ cảnh gói công việc" - label_unwatch: "Ngừng theo dõi" - label_unwatch_work_package: "Ngừng theo dõi gói công việc" + label_unwatch: "Bỏ xem" + label_unwatch_work_package: "Bỏ xem gói công việc" label_uploaded_by: "Tải lên bởi" - label_default_queries: "Mặc định" - label_starred_queries: "Yêu thích" - label_global_queries: "Công cộng" - label_custom_queries: "Riêng tư" + label_default_queries: "mặc định" + label_starred_queries: "yêu thích" + label_global_queries: "công khai" + label_custom_queries: "riêng tư" label_columns: "Cột" - label_attachments: Đính kèm - label_drop_files: "Kéo các tệp vào đây để đính kèm." - label_drop_or_click_files: "Kéo các tệp vào đây hoặc nhấp để đính kèm." - label_drop_folders_hint: Bạn không thể tải lên thư mục dưới dạng tài liệu đính kèm. Vui lòng chọn các tệp đơn lẻ. - label_add_attachments: "Đính kèm tệp" - label_formattable_attachment_hint: "Đính kèm và liên kết tập tin bằng cách thả vào đây, hoặc copy và dán." + label_attachments: tệp đính kèm + label_drop_files: "Thả tập tin vào đây để đính kèm tập tin." + label_drop_or_click_files: "Thả tập tin vào đây hoặc bấm vào để đính kèm tập tin." + label_drop_folders_hint: Bạn không thể tải lên các thư mục dưới dạng tệp đính kèm. Vui lòng chọn các tập tin duy nhất. + label_add_attachments: "Đính kèm tập tin" + label_formattable_attachment_hint: "Đính kèm và liên kết các tệp bằng cách thả vào trường này hoặc dán từ bảng ghi tạm." label_remove_file: "Xóa %{fileName}" label_remove_watcher: "Loại bỏ người theo dõi %{name}" label_remove_all_files: Xóa tất cả các tập tin label_add_description: "Thêm mô tả cho %{file}" - label_upload_notification: "Tải lên tệp tin..." - label_work_package_upload_notification: "Tải file cho một công việc #%{id}: %{subject}" + label_upload_notification: "Đang tải tệp lên..." + label_work_package_upload_notification: "Đang tải lên tập tin cho gói công việc #%{id}: %{subject}" label_wp_id_added_by: "#%{id} được thêm bởi %{author}" label_files_to_upload: "Những tập tin này sẽ được tải lên:" - label_rejected_files: "Các tệp này không thể được tải lên:" - label_rejected_files_reason: "Các tệp này không thể được tải lên như kích thước của họ là lớn hơn %{maximumFilesize}" - label_wait: "Xin vui lòng chờ cho cấu hình..." - label_upload_counter: "%{done} %{count} tập tin hoàn thành" - label_validation_error: "Không thể lưu các công việc do các lỗi sau đây:" - label_version_plural: "Các phiên bản" - label_view_has_changed: "Chế độ xem này có các thay đổi chưa được lưu. Nhấp để lưu chúng." + label_rejected_files: "Những tập tin này không thể được tải lên:" + label_rejected_files_reason: "Không thể tải lên những tệp này vì kích thước của chúng lớn hơn %{maximumFilesize}" + label_wait: "Vui lòng chờ cấu hình..." + label_upload_counter: "%{done} trong số %{count} tệp đã hoàn tất" + label_validation_error: "Không thể lưu gói công việc do các lỗi sau:" + label_version_plural: "phiên bản" + label_view_has_changed: "Chế độ xem này có những thay đổi chưa được lưu. Nhấn vào đây để lưu chúng." help_texts: - show_modal: "Show help text" + show_modal: "Hiển thị văn bản trợ giúp" onboarding: buttons: - skip: "Bỏ qua" + skip: "bỏ qua" next: "Tiếp" - got_it: "Đã hiểu" + got_it: "Hiểu rồi" steps: help_menu: "Menu Trợ giúp (?) cung cấp các tài nguyên trợ giúp bổ sung. Tại đây bạn có thể tìm thấy hướng dẫn người dùng, video hướng dẫn hữu ích và nhiều hơn nữa.
    Chúc bạn làm việc vui vẻ với OpenProject!" - members: "Mời thành viên mới tham gia dự án của bạn." - quick_add_button: "Nhấp vào biểu tượng cộng (+) trong thanh điều hướng tiêu đề để tạo một dự án mới hoặc mời đồng nghiệp." - sidebar_arrow: "Sử dụng mũi tên trở lại ở góc trên bên trái để quay lại menu chính của dự án." - welcome: "Take a three-minute introduction tour to learn the most important features.
    We recommend completing the steps until the end. You can restart the tour any time." - wiki: "Trong wiki, bạn có thể tài liệu hóa và chia sẻ kiến thức cùng với nhóm của bạn." + members: "Mời thành viên mới tham gia dự án của bạn." + quick_add_button: "Nhấp vào biểu tượng dấu cộng (+) trong điều hướng tiêu đề để tạo dự án mới hoặc để mời đồng nghiệp." + sidebar_arrow: "Sử dụng mũi tên quay lại ở góc trên cùng bên trái để quay lại menu chính của dự án." + welcome: "Hãy tham gia chuyến tham quan giới thiệu dài ba phút để tìm hiểu tính năng quan trọng nhất.
    Chúng tôi khuyên bạn nên hoàn thành các bước cho đến hết. Bạn có thể bắt đầu lại chuyến tham quan bất cứ lúc nào." + wiki: "Trong wiki bạn có thể ghi lại và chia sẻ kiến ​​thức cùng với nhóm của mình." backlogs: overview: "Quản lý công việc của bạn trong chế độ xem backlogs." - sprints: "Bên phải bạn có backlog sản phẩm và backlog lỗi, bên trái bạn có các sprint tương ứng. Tại đây bạn có thể tạo epics, user stories và bugs, ưu tiên qua kéo & thả và thêm chúng vào một sprint." - task_board_arrow: "Để xem bảng công việc của bạn, mở menu thả xuống sprint..." - task_board_select: "...và chọn mục bảng công việc." - task_board: "Bảng công việc hình ảnh hóa tiến độ cho sprint này. Nhấp vào biểu tượng cộng (+) bên cạnh một user story để thêm nhiệm vụ hoặc vấn đề.
    Trạng thái có thể được cập nhật bằng cách kéo và thả." + sprints: "Ở bên phải, bạn có tồn đọng sản phẩm và tồn đọng lỗi, ở bên trái, bạn có các lần chạy nước rút tương ứng. Tại đây, bạn có thể tạo sử thi, cốt truyện của người dùng và lỗi, ưu tiên bằng cách kéo và thả và thêm chúng vào chạy nước rút." + task_board_arrow: "Để xem bảng nhiệm vụ của bạn, hãy mở trình đơn thả xuống chạy nước rút..." + task_board_select: "...và chọn mục nhập bảng nhiệm vụ." + task_board: "Bảng nhiệm vụ hiển thị tiến trình cho lần chạy nước rút này. Nhấp vào biểu tượng dấu cộng (+) bên cạnh cốt truyện của người dùng để thêm nhiệm vụ hoặc trở ngại mới.
    Trạng thái có thể được cập nhật bằng cách kéo và thả." boards: - overview: "Chọn bảng để thay đổi chế độ xem và quản lý dự án của bạn bằng chế độ xem bảng agile." - lists_kanban: "Tại đây bạn có thể tạo nhiều danh sách (cột) trong bảng của bạn. Tính năng này cho phép bạn tạo một bảng Kanban, ví dụ." - lists_basic: "Tại đây bạn có thể tạo nhiều danh sách (cột) trong bảng agile của bạn." - add: "Nhấp vào biểu tượng cộng (+) để tạo một thẻ mới hoặc thêm một thẻ hiện có vào danh sách trên bảng." - drag: "Kéo và thả các thẻ của bạn trong một danh sách để thay đổi thứ tự, hoặc di chuyển chúng đến danh sách khác.
    Bạn có thể nhấp vào biểu tượng thông tin (i) ở góc trên bên phải hoặc nhấp đúp vào thẻ để mở chi tiết của nó." + overview: "Chọn boards để thay đổi chế độ xem và quản lý dự án của bạn bằng chế độ xem bảng linh hoạt." + lists_kanban: "Tại đây bạn có thể tạo nhiều danh sách (cột) trong bảng của mình. Ví dụ: tính năng này cho phép bạn tạo Kanban board." + lists_basic: "Tại đây, bạn có thể tạo nhiều danh sách (cột) trong bảng linh hoạt của mình." + add: "Bấm vào biểu tượng dấu cộng (+) để tạo thẻ mới hoặc thêm thẻ hiện có vào danh sách trên bảng." + drag: "Kéo và thả thẻ của bạn trong danh sách nhất định để sắp xếp lại chúng hoặc di chuyển chúng sang danh sách khác.
    Bạn có thể nhấp vào biểu tượng thông tin (i) ở góc trên bên phải hoặc nhấp đúp vào thẻ để mở thông tin chi tiết." wp: - toggler: "Bây giờ hãy xem phần gói công việc, nơi cung cấp cái nhìn chi tiết hơn về công việc của bạn." - list: "Danh sách gói công việc này cung cấp danh sách tất cả công việc trong dự án của bạn, chẳng hạn như nhiệm vụ, mốc, giai đoạn, và nhiều hơn nữa.
    Các gói công việc có thể được tạo và chỉnh sửa trực tiếp từ chế độ xem này. Để truy cập chi tiết của một gói công việc cụ thể, chỉ cần nhấp đúp vào hàng của nó." - full_view: "Chế độ xem chi tiết gói công việc cung cấp tất cả thông tin liên quan đến một gói công việc nhất định, chẳng hạn như mô tả, trạng thái, ưu tiên, hoạt động, phụ thuộc và bình luận." - back_button: "Sử dụng mũi tên trở lại ở góc trên bên trái để thoát và quay lại danh sách gói công việc." - create_button: "Nút + Tạo sẽ thêm một gói công việc mới vào dự án của bạn." - gantt_menu: "Tạo lịch dự án và thời gian một cách dễ dàng bằng cách sử dụng mô-đun biểu đồ Gantt." - timeline: "Tại đây bạn có thể chỉnh sửa kế hoạch dự án, tạo các gói công việc mới, chẳng hạn như nhiệm vụ, mốc, giai đoạn, và nhiều hơn nữa, cũng như thêm phụ thuộc. Tất cả các thành viên trong nhóm có thể xem và cập nhật kế hoạch mới nhất bất kỳ lúc nào." + toggler: "Bây giờ chúng ta hãy xem phần work package, phần này sẽ cung cấp cho bạn cái nhìn chi tiết hơn về công việc của bạn." + list: "Tổng quan về gói work này cung cấp danh sách tất cả công việc trong dự án của bạn, chẳng hạn như nhiệm vụ, cột mốc, giai đoạn, v.v.
    Các gói công việc có thể được tạo và chỉnh sửa trực tiếp từ chế độ xem này. Để truy cập chi tiết của một gói công việc cụ thể, chỉ cần nhấp đúp vào hàng của nó." + full_view: "Chế độ xem chi tiết gói công việc cung cấp tất cả thông tin liên quan liên quan đến gói công việc nhất định, chẳng hạn như mô tả, trạng thái, mức độ ưu tiên, hoạt động, sự phụ thuộc và nhận xét." + back_button: "Sử dụng mũi tên quay lại ở góc trên cùng bên trái để thoát và quay lại danh sách gói công việc." + create_button: "Nút + Create sẽ thêm gói công việc mới vào dự án của bạn." + gantt_menu: "Tạo lịch trình và mốc thời gian của dự án một cách dễ dàng bằng cách sử dụng mô-đun biểu đồ Gantt." + timeline: "Tại đây, bạn có thể chỉnh sửa kế hoạch dự án của mình, tạo các gói công việc mới, chẳng hạn như nhiệm vụ, mốc quan trọng, giai đoạn, v.v., cũng như thêm các phần phụ thuộc. Tất cả thành viên trong nhóm có thể xem và cập nhật kế hoạch mới nhất bất cứ lúc nào." team_planner: - overview: "Lập kế hoạch đội ngũ cho phép bạn phân công nhiệm vụ cho các thành viên trong nhóm và có cái nhìn tổng quan về ai đang làm gì." - calendar: "Bảng kế hoạch hàng tuần hoặc hai tuần hiển thị tất cả các gói công việc được phân công cho các thành viên trong nhóm của bạn." - add_assignee: "Để bắt đầu, thêm người thực hiện vào lập kế hoạch đội ngũ." - add_existing: "Tìm các gói công việc hiện có và kéo chúng vào lập kế hoạch đội ngũ để ngay lập tức phân công cho một thành viên trong nhóm và xác định ngày bắt đầu và kết thúc." - card: "Kéo các gói công việc theo chiều ngang để di chuyển chúng lùi hoặc tiến về phía trước theo thời gian, kéo các cạnh để thay đổi ngày bắt đầu và kết thúc và thậm chí kéo chúng theo chiều dọc đến hàng khác để phân công cho một thành viên khác." + overview: "Công cụ lập kế hoạch nhóm cho phép bạn phân công nhiệm vụ cho các thành viên trong nhóm một cách trực quan và có được cái nhìn tổng quan về ai đang làm việc gì." + calendar: "Bảng kế hoạch hàng tuần hoặc hai tuần một lần hiển thị tất cả các gói công việc được giao cho các thành viên trong nhóm của bạn." + add_assignee: "Để bắt đầu, hãy thêm người được phân công vào người lập kế hoạch nhóm." + add_existing: "Tìm kiếm các gói công việc hiện có và kéo chúng vào bảng lập kế hoạch nhóm để phân công ngay cho một thành viên trong nhóm cũng như xác định ngày bắt đầu và ngày kết thúc." + card: "Kéo các gói công việc theo chiều ngang để di chuyển chúng tới hoặc lui theo thời gian, kéo các cạnh để thay đổi ngày bắt đầu và ngày kết thúc, thậm chí kéo chúng theo chiều dọc đến một hàng khác để gán chúng cho thành viên khác." notifications: - title: "Thông báo" + title: "thông báo" no_unread: "Không có thông báo chưa đọc" reasons: - mentioned: "Nhắc đến" + mentioned: "Được đề cập" watched: "Người quan sát" - assigned: "Người được giao" + assigned: "Người được chuyển nhượng" #The enum value is named 'responsible' in the database and that is what is transported through the API #up to the frontend. - responsible: "Trách nhiệm" - created: "Đã tạo" - scheduled: "Đã xếp lịch" - commented: "Nhận xét" + responsible: "chịu trách nhiệm" + created: "đã tạo" + scheduled: "theo lịch trình" + commented: "Đã bình luận" processed: "đã xử lý" - prioritized: "được ưu tiên" + prioritized: "Được ưu tiên" dateAlert: "Cảnh báo ngày" - shared: "Được chia sẻ" - reminder: "Reminder" + shared: "đã chia sẻ" + reminder: "Lời nhắc" date_alerts: - milestone_date: "Ngày mốc" - overdue: "Quá hạn" - overdue_since: "for %{difference_in_days}." - property_today: "is today." - property_is: "is in %{difference_in_days}." - property_was: "was %{difference_in_days} ago." - property_is_deleted: "is deleted." + milestone_date: "Ngày quan trọng" + overdue: "quá hạn" + overdue_since: "cho %{difference_in_days}." + property_today: "là ngày hôm nay." + property_is: "ở %{difference_in_days}." + property_was: "là %{difference_in_days} trước đây." + property_is_deleted: "bị xóa." center: label_actor_and: "và" and_more_users: - other: "và %{count} nữa" + other: "và %{count} người khác" no_results: - at_all: "Thông báo mới sẽ xuất hiện ở đây khi có hoạt động liên quan đến bạn." - with_current_filter: "Hiện không có thông báo trong chế độ xem này" + at_all: "Thông báo mới sẽ xuất hiện ở đây khi có hoạt động khiến bạn quan tâm." + with_current_filter: "Hiện tại không có thông báo nào trong chế độ xem này" mark_all_read: "Đánh dấu tất cả là đã đọc" mark_as_read: "Đánh dấu là đã đọc" - mark_all_read_confirmation: "This will mark all notifications in this view as read. Are you sure you want to do this?" + mark_all_read_confirmation: "Thao tác này sẽ đánh dấu tất cả thông báo trong chế độ xem này là đã đọc. Bạn có chắc chắn muốn làm điều này?" text_update_date_by: "%{date} bởi" - total_count_warning: "Hiển thị %{newest_count} thông báo gần đây nhất. %{more_count} thông báo khác chưa được hiển thị." + total_count_warning: "Hiển thị %{newest_count} thông báo gần đây nhất. %{more_count} thêm không được hiển thị." empty_state: - no_notification: "Có vẻ như bạn đã đọc hết các thông báo." - no_notification_with_current_project_filter: "Có vẻ như bạn đã đọc hết các thông báo của dự án đã chọn." - no_notification_with_current_filter: "Có vẻ như bạn đã đọc hết thông báo cho bộ lọc %{filter}." - no_notification_for_filter: "Có vẻ như bạn đã hiểu hết về bộ lọc này." + no_notification: "Có vẻ như tất cả các bạn đã bị cuốn theo." + no_notification_with_current_project_filter: "Có vẻ như tất cả các bạn đã bắt kịp dự án đã chọn." + no_notification_with_current_filter: "Có vẻ như bạn đã quan tâm đến bộ lọc %{filter}." + no_notification_for_filter: "Có vẻ như tất cả các bạn đều bị cuốn hút bởi bộ lọc này." no_selection: "Nhấp vào thông báo để xem tất cả chi tiết hoạt động." new_notifications: message: "Có thông báo mới." - link_text: "Nhấp vào đây để tải chúng." + link_text: "Nhấn vào đây để tải chúng." reminders: - note: "Note: “%{note}”" + note: "Lưu ý: “%{note}”" settings: change_notification_settings: 'Bạn có thể thay đổi cài đặt thông báo của mình để đảm bảo không bỏ lỡ cập nhật quan trọng nào.' title: "Cài đặt thông báo" @@ -599,269 +600,266 @@ vi: P7D: một tuần trước overdue: P1D: mỗi ngày - P3D: mỗi 3 ngày + P3D: cứ sau 3 ngày P7D: mỗi tuần reasons: mentioned: - title: "nhắc đến" - description: "Nhận thông báo mỗi khi ai đó nhắc đến tôi ở bất kỳ đâu" - assignee: "Người được giao" - responsible: "Trách nhiệm" - shared: "được chia sẻ" - watched: "Người quan sát" + title: "Được đề cập" + description: "Nhận thông báo mỗi khi ai đó nhắc đến tôi ở bất cứ đâu" + assignee: "Người được chuyển nhượng" + responsible: "chịu trách nhiệm" + shared: "đã chia sẻ" + watched: "người theo dõi" work_package_commented: "Tất cả bình luận mới" work_package_created: "Gói công việc mới" - work_package_processed: "Tất cả thay đổi trạng thái" - work_package_prioritized: "Tất cả thay đổi ưu tiên" - work_package_scheduled: "Tất cả thay đổi ngày" + work_package_processed: "Mọi thay đổi trạng thái" + work_package_prioritized: "Tất cả các thay đổi ưu tiên" + work_package_scheduled: "Tất cả các thay đổi ngày" global: immediately: title: "Tham gia" - description: "Thông báo cho tất cả hoạt động trong các gói công việc mà bạn tham gia (người được giao, người chịu trách nhiệm hoặc người theo dõi)." + description: "Thông báo cho tất cả các hoạt động trong gói công việc mà bạn tham gia (người được giao, người chịu trách nhiệm hoặc người theo dõi)." delayed: title: "Không tham gia" description: "Thông báo bổ sung cho các hoạt động trong tất cả các dự án." date_alerts: - title: "Cảnh báo ngày" - description: "Thông báo tự động khi các ngày quan trọng sắp đến cho các gói công việc mở mà bạn tham gia (người được giao, người chịu trách nhiệm hoặc người theo dõi)." + title: "Thông báo ngày" + description: "Thông báo tự động khi các ngày quan trọng đang đến gần đối với các gói công việc đang mở mà bạn tham gia (người được giao, người chịu trách nhiệm hoặc người theo dõi)." overdue: Khi quá hạn project_specific: - title: "Cài đặt thông báo theo dự án" - description: "Các cài đặt theo dự án này ghi đè các cài đặt mặc định ở trên." + title: "Cài đặt thông báo dành riêng cho dự án" + description: "Các cài đặt dành riêng cho dự án này sẽ ghi đè các cài đặt mặc định ở trên." add: "Thêm cài đặt cho dự án" already_selected: "Dự án này đã được chọn" remove: "Xóa cài đặt dự án" - password_confirmation: - field_description: "Bạn cần nhập mật khẩu tài khoản của mình để xác nhận thay đổi này." - title: "Xác nhận mật khẩu của bạn để tiếp tục" pagination: no_other_page: "Bạn đang trên trang duy nhất." - pages_skipped: "Pages skipped." - page_navigation: "Pagination navigation" - per_page_navigation: 'Items per page selection' + pages_skipped: "Các trang bị bỏ qua." + page_navigation: "Điều hướng phân trang" + per_page_navigation: 'Lựa chọn mục trên mỗi trang' pages: - page_number: Page %{number} - show_per_page: Show %{number} per page + page_number: Trang %{number} + show_per_page: Hiển thị %{number} trên mỗi trang placeholders: default: "-" - subject: "Nhập tiêu đề ở đây" + subject: "Nhập chủ đề vào đây" selection: "Vui lòng chọn" - description: "Mô tả: Nhấp để chỉnh sửa..." + description: "Mô tả: Click để chỉnh sửa..." relation_description: "Nhấp để thêm mô tả cho mối quan hệ này" project: autocompleter: - label: "Hoàn tất tự động dự án" + label: "Tự động hoàn thành dự án" click_to_switch_to_project: "Dự án: %{projectname}" - context: "Ngữ cảnh dự án" - not_available: "Project N/A" + context: "Bối cảnh dự án" + not_available: "Dự án N/A" required_outside_context: > - Vui lòng chọn một dự án để tạo gói công việc nhằm xem tất cả các thuộc tính. Bạn chỉ có thể chọn các dự án mà loại trên đã được kích hoạt. + Vui lòng chọn một dự án để tạo gói công việc để xem tất cả các thuộc tính. Bạn chỉ có thể chọn các dự án đã kích hoạt loại trên. reminders: settings: daily: add_time: "Thêm thời gian" - enable: "Kích hoạt nhắc nhở email hàng ngày" - explanation: "Bạn sẽ nhận được các nhắc nhở này chỉ cho các thông báo chưa đọc và chỉ vào những giờ bạn chỉ định. %{no_time_zone}" - no_time_zone: "Cho đến khi bạn cấu hình múi giờ cho tài khoản của mình, các giờ sẽ được hiểu là UTC." + enable: "Bật lời nhắc email hàng ngày" + explanation: "Bạn sẽ chỉ nhận được những lời nhắc này đối với những thông báo chưa đọc và chỉ vào những giờ bạn chỉ định. %{no_time_zone}" + no_time_zone: "Cho đến khi bạn định cấu hình múi giờ cho tài khoản của mình, thời gian sẽ được hiểu là theo UTC." time_label: "Thời gian %{counter}:" - title: "Gửi cho tôi nhắc nhở email hàng ngày cho các thông báo chưa đọc" + title: "Gửi cho tôi lời nhắc email hàng ngày về các thông báo chưa đọc" workdays: - title: "Nhận nhắc nhở email vào những ngày này" + title: "Nhận lời nhắc qua email vào những ngày này" immediate: - title: "Gửi cho tôi nhắc nhở email" - mentioned: "Ngay lập tức khi ai đó nhắc đến tôi" - personal_reminder: "Immediately when I receive a personal reminder" + title: "Gửi cho tôi lời nhắc qua email" + mentioned: "Ngay lập tức khi ai đó @đề cập đến tôi" + personal_reminder: "Ngay lập tức khi tôi nhận được lời nhắc cá nhân" alerts: - title: "Cảnh báo email cho các mục khác (không phải gói công việc)" + title: "Thông báo qua email cho các mục khác (không phải là gói công việc)" explanation: > - Các thông báo hiện tại chỉ giới hạn cho gói công việc. Bạn có thể chọn tiếp tục nhận cảnh báo email cho các sự kiện này cho đến khi chúng được đưa vào thông báo: - news_added: "Đã thêm tin" + Thông báo ngày hôm nay được giới hạn trong các gói công việc. Bạn có thể chọn tiếp tục nhận thông báo qua email cho những sự kiện này cho đến khi chúng được đưa vào thông báo: + news_added: "Đã thêm tin tức" news_commented: "Bình luận về một tin tức" - document_added: "Tài liệu được thêm vào" - forum_messages: "Tin nhắn diễn đàn mới" + document_added: "Đã thêm tài liệu" + forum_messages: "Thông báo diễn đàn mới" wiki_page_added: "Đã thêm trang Wiki" - wiki_page_updated: "Trang Wiki đã được cập nhật" - membership_added: "Thành viên được thêm vào" - membership_updated: "Thành viên được cập nhật" - title: "Nhắc nhở email" + wiki_page_updated: "Trang Wiki được cập nhật" + membership_added: "Đã thêm thành viên" + membership_updated: "Đã cập nhật tư cách thành viên" + title: "Lời nhắc qua email" pause: label: "Tạm dừng nhắc nhở email hàng ngày" first_day: "Ngày đầu tiên" last_day: "Ngày cuối cùng" text_are_you_sure: "Bạn có chắc không?" - text_are_you_sure_to_cancel: "You have unsaved changes on this page. Are you sure you want to discard them?" - breadcrumb: "Breadcrumb" + text_are_you_sure_to_cancel: "Bạn có những thay đổi chưa được lưu trên trang này. Bạn có chắc chắn muốn loại bỏ chúng không?" + breadcrumb: "vụn bánh mì" text_data_lost: "Tất cả dữ liệu đã nhập sẽ bị mất." text_user_wrote: "%{value} đã viết:" types: attribute_groups: - error_duplicate_group_name: "Tên %{group} được sử dụng nhiều hơn một lần. Tên nhóm phải là duy nhất." - error_no_table_configured: "Vui lòng cấu hình một bảng cho %{group}." + error_duplicate_group_name: "Tên %{group} được sử dụng nhiều lần. Tên nhóm phải là duy nhất." + error_no_table_configured: "Vui lòng định cấu hình bảng cho %{group}." reset_title: "Đặt lại cấu hình biểu mẫu" confirm_reset: > - Chú ý: Bạn có chắc bạn muốn đặt lại cấu hình dạng? Điều này sẽ thiết lập lại các thuộc tính của nhóm mặc định và vô hiệu hóa tất cả các trường tùy chỉnh. - upgrade_to_ee: "Nâng cấp lên phiên bản Enterprise on-premises" - upgrade_to_ee_text: "Wow! Nếu bạn cần tiện ích bổ sung này, bạn là một chuyên gia tuyệt vời! Bạn có thể hỗ trợ chúng tôi, các nhà phát triển OpenSource, bằng cách trở thành khách hàng của phiên bản Enterprise không?" + Cảnh báo: Bạn có chắc chắn muốn đặt lại cấu hình biểu mẫu không? Điều này sẽ đặt lại các thuộc tính về nhóm mặc định của chúng và vô hiệu hóa TẤT CẢ các trường tùy chỉnh. + upgrade_to_ee: "Nâng cấp lên phiên bản Enterprise tại chỗ" + upgrade_to_ee_text: "Ồ! Nếu bạn cần tiện ích bổ sung này thì bạn là một siêu chuyên nghiệp! Bạn có phiền khi hỗ trợ các nhà phát triển OpenSource của chúng tôi bằng cách trở thành khách hàng phiên bản Enterprise không?" more_information: "Thêm thông tin" - nevermind: "Không sao" + nevermind: "bỏ qua" time_entry: - work_package_required: "Yều cầu chọn một gói công việc đầu tiên." - title: "Thời gian truy cập" + work_package_required: "Yêu cầu chọn gói công việc trước tiên." + title: "Đăng nhập thời gian" tracking: "Theo dõi thời gian" stop: "Dừng lại" timer: - start_new_timer: "Bắt đầu đồng hồ bấm giờ mới" - timer_already_running: "Để bắt đầu đồng hồ bấm giờ mới, trước tiên bạn phải dừng đồng hồ bấm giờ hiện tại:" - timer_already_stopped: "Không có đồng hồ bấm giờ hoạt động cho gói công việc này, bạn đã dừng nó ở cửa sổ khác chưa?" - tracking_time: "Theo dõi thời gian" - button_stop: "Dừng đồng hồ bấm giờ hiện tại" + start_new_timer: "Bắt đầu hẹn giờ mới" + timer_already_running: "Để bắt đầu bộ hẹn giờ mới, trước tiên bạn phải dừng bộ hẹn giờ hiện tại:" + timer_already_stopped: "Không có bộ đếm thời gian hoạt động cho gói công việc này, bạn đã dừng nó ở cửa sổ khác chưa?" + tracking_time: "thời gian theo dõi" + button_stop: "Dừng bộ đếm thời gian hiện tại" two_factor_authentication: label_two_factor_authentication: "Xác thực hai yếu tố" watchers: - label_loading: lấy danh sách người theo dõi... + label_loading: đang tải người theo dõi... label_error_loading: Lỗi khi tải về danh sách người theo dõi - label_search_watchers: Tìm kiếm người theo dõi + label_search_watchers: Người theo dõi tìm kiếm label_add: Thêm người theo dõi - label_discard: Loại bỏ lựa chọn - typeahead_placeholder: Tìm kiếm người có thể theo dõi + label_discard: Hủy lựa chọn + typeahead_placeholder: Tìm kiếm người theo dõi có thể relation_labels: - parent: "Cha" - child: "Child" - children: "Con" + parent: "cha mẹ" + child: "đứa trẻ" + children: "bọn trẻ" relates: "Liên quan đến" - duplicates: "Trùng lặp" - duplicated: "Bị trùng lặp bởi" - blocks: "Chặn" + duplicates: "trùng lặp" + duplicated: "Nhân bản bởi" + blocks: "khối" blocked: "Bị chặn bởi" - precedes: "Tiền nhiệm" - follows: "Kế nhiệm" - includes: "Bao gồm" - partof: "Là một phần của" + precedes: "đi trước" + follows: "theo sau" + includes: "bao gồm" + partof: "Một phần của" requires: "Yêu cầu" - required: "Yêu cầu bởi" - relation_type: "Loại quan hệ" + required: "Được yêu cầu bởi" + relation_type: "kiểu quan hệ" relations_hierarchy: - parent_headline: "Cha" + parent_headline: "cha mẹ" hierarchy_headline: "Phân cấp" - children_headline: "Con" + children_headline: "bọn trẻ" relation_buttons: - set_parent: "Đặt cha" - change_parent: "Thay đổi cha" - remove_parent: "Xóa cha" - hierarchy_indent: "Thụt lề hệ thống phân cấp" - hierarchy_outdent: "Bỏ thụt lề hệ thống phân cấp" + set_parent: "Đặt cha mẹ" + change_parent: "Thay đổi cha mẹ" + remove_parent: "Xóa cha mẹ" + hierarchy_indent: "Thụt lề phân cấp" + hierarchy_outdent: "Phân cấp vượt mức" group_by_wp_type: "Nhóm theo loại gói công việc" group_by_relation_type: "Nhóm theo loại quan hệ" - add_parent: "Thêm cha hiện có" + add_parent: "Thêm cha mẹ hiện có" add_new_child: "Tạo con mới" create_new: "Tạo mới" add_existing: "Thêm hiện có" - add_existing_child: "Add child" + add_existing_child: "Thêm con" remove_child: "Xóa con" - add_new_relation: "Tạo quan hệ mới" - add_existing_relation: "Thêm quan hệ hiện có" - update_description: "Đặt hoặc cập nhật mô tả của quan hệ này" - toggle_description: "Chuyển đổi mô tả quan hệ" - update_relation: "Nhấp để thay đổi loại quan hệ" - show_relations: "Hiển thị các mối quan hệ" + add_new_relation: "Tạo mối quan hệ mới" + add_existing_relation: "Thêm mối quan hệ hiện có" + update_description: "Đặt hoặc cập nhật mô tả của mối quan hệ này" + toggle_description: "Chuyển đổi mô tả mối quan hệ" + update_relation: "Bấm để thay đổi kiểu quan hệ" + show_relations: "Hiển thị mối quan hệ" add_predecessor: "Thêm người tiền nhiệm" - add_successor: "Add successor" + add_successor: "Thêm người kế vị" remove: "Xóa mối quan hệ" - save: "Lưu quan hệ" - abort: "Hủy" + save: "Lưu mối quan hệ" + abort: "Hủy bỏ" relations_autocomplete: - placeholder: "Gõ để tìm kiếm" - parent_placeholder: "Chọn cha mới hoặc nhấn escape để hủy." + placeholder: "Nhập để tìm kiếm" + parent_placeholder: "Chọn cha mẹ mới hoặc nhấn thoát để hủy." autocompleter: - placeholder: "Gõ để tìm kiếm" + placeholder: "Nhập để tìm kiếm" notFoundText: "Không tìm thấy mục nào" - search: "Tìm kiếm" + search: "tìm kiếm" project: placeholder: "Chọn dự án" repositories: select_tag: "Chọn từ khóa" - select_branch: "Chọn nhánh" + select_branch: "Chọn chi nhánh" field_value_enter_prompt: "Nhập giá trị cho '%{field}'" - project_menu_details: "Chi tiết" + project_menu_details: "chi tiết" sort: - sorted_asc: "Sắp xếp tăng dần đã được áp dụng, " - sorted_dsc: "Sắp xếp giảm dần đã được áp dụng, " - sorted_no: "Chưa sắp xếp, " + sorted_asc: "Áp dụng sắp xếp tăng dần," + sorted_dsc: "Áp dụng sắp xếp giảm dần," + sorted_no: "Không áp dụng sắp xếp," sorting_disabled: "sắp xếp bị vô hiệu hóa" activate_asc: "kích hoạt để áp dụng sắp xếp tăng dần" activate_dsc: "kích hoạt để áp dụng sắp xếp giảm dần" activate_no: "kích hoạt để loại bỏ sắp xếp" - text_work_packages_destroy_confirmation: "Bạn có chắc chắn muốn xóa gói công việc(s) đã chọn không?" + text_work_packages_destroy_confirmation: "Bạn có chắc chắn muốn xóa (các) gói công việc đã chọn không?" text_query_destroy_confirmation: "Bạn muốn xóa các mục đã chọn?" tl_toolbar: zooms: "Mức thu phóng" - outlines: "Mức phân cấp" + outlines: "Cấp độ phân cấp" upsell: - ee_only: "Bổ sung phiên bản Doanh nghiệp" + ee_only: "Tiện ích bổ sung cho phiên bản doanh nghiệp" wiki_formatting: - strong: "In đậm" - italic: "In nghiêng" - underline: "Gạch chân" - deleted: "Đã xóa" - code: "Mã nhúng" + strong: "đậm" + italic: "Nghiêng" + underline: "gạch chân" + deleted: "đã xóa" + code: "Mã nội tuyến" heading1: "Tiêu đề 1" heading2: "Tiêu đề 2" heading3: "Tiêu đề 3" unordered_list: "Danh sách không có thứ tự" - ordered_list: "Danh sách có thứ tự" - quote: "Trích dẫn" + ordered_list: "Danh sách đặt hàng" + quote: "trích dẫn" unquote: "Bỏ trích dẫn" - preformatted_text: "Văn bản định dạng trước" - wiki_link: "Liên kết đến trang Wiki" - image: "Hình ảnh" + preformatted_text: "Văn bản được định dạng sẵn" + wiki_link: "Liên kết tới một trang Wiki" + image: "hình ảnh" sharing: - share: "Chia sẻ" + share: "chia sẻ" selected_count: "%{count} đã chọn" selection: - mixed: "Lẫn lộn" + mixed: "Hỗn hợp" work_packages: bulk_actions: edit: "Chỉnh sửa hàng loạt" delete: "Xoá hàng loạt" - duplicate: "Bulk duplicate" + duplicate: "Sao chép hàng loạt" move: "Thay đổi hàng loạt dự án" button_clear: "Xóa" comment_added: "Bình luận được thêm thành công." comment_send_failed: "Lỗi đã xảy ra. Không thể gửi bình luận." comment_updated: "Các bình luận đã được cập nhật thành công." - confirm_edit_cancel: "Bạn có chắc bạn muốn hủy bỏ chỉnh sửa work package?" - description_filter: "Bộ lọc" + confirm_edit_cancel: "Bạn có chắc chắn muốn hủy việc chỉnh sửa gói công việc không?" + description_filter: "bộ lọc" description_enter_text: "Nhập văn bản" description_options_hide: "Ẩn tùy chọn" description_options_show: "Hiển thị tùy chọn" edit_attribute: "%{attribute} - chỉnh sửa" key_value: "%{key}: %{value}" - label_enable_multi_select: "Kích hoạt chọn nhiều" - label_disable_multi_select: "Vô hiệu hóa chọn nhiều" + label_enable_multi_select: "Bật nhiều lựa chọn" + label_disable_multi_select: "Vô hiệu hóa nhiều lựa chọn" label_filter_add: "Thêm bộ lọc" label_filter_by_text: "Lọc bởi %text" - label_options: "Tuỳ chọn" - label_column_multiselect: "Trường thả xuống kết hợp: Chọn bằng các phím mũi tên, xác nhận lựa chọn bằng enter, xóa bằng phím backspace" - message_error_during_bulk_delete: Đã xảy ra lỗi khi cố gắng xóa gói công việc. - message_successful_bulk_delete: Đã xóa gói công việc thành công. - message_successful_show_in_fullscreen: "Click vào đây để mở work package này trong chế độ xem toàn màn hình." - message_view_spent_time: "Hiển thị thời gian đã sử dụng cho gói công việc này" - message_work_package_read_only: "Gói công việc bị khóa ở trạng thái này. Không thể thay đổi thuộc tính khác ngoài trạng thái." - message_work_package_status_blocked: "Trạng thái gói công việc không thể viết do trạng thái đã đóng và phiên bản đã đóng được gán." - placeholder_filter_by_text: "Chủ đề, mô tả, bình luận, ..." + label_options: "tùy chọn" + label_column_multiselect: "Trường thả xuống kết hợp: Chọn bằng phím mũi tên, xác nhận lựa chọn bằng enter, xóa bằng phím lùi" + message_error_during_bulk_delete: Đã xảy ra lỗi khi cố xóa gói công việc. + message_successful_bulk_delete: Đã xóa thành công các gói công việc. + message_successful_show_in_fullscreen: "Bấm vào đây để mở gói công việc này ở chế độ xem toàn màn hình." + message_view_spent_time: "Hiển thị thời gian dành cho gói công việc này" + message_work_package_read_only: "Gói công việc bị khóa ở trạng thái này. Không có thuộc tính nào khác ngoài trạng thái có thể được thay đổi." + message_work_package_status_blocked: "Trạng thái gói công việc không thể ghi được do trạng thái đóng và phiên bản đóng đang được chỉ định." + placeholder_filter_by_text: "Chủ đề, mô tả, nhận xét,..." progress: - title: "Ước lượng công việc và tiến độ" + title: "Ước tính và tiến độ công việc" baseline: addition_label: "Thêm vào chế độ xem trong khoảng thời gian so sánh" - removal_label: "Gỡ bỏ khỏi chế độ xem trong khoảng thời gian so sánh" - modification_label: "Đã thay đổi trong khoảng thời gian so sánh" - column_incompatible: "Cột này không hiển thị thay đổi trong chế độ Baseline." + removal_label: "Đã bị xóa khỏi chế độ xem trong khoảng thời gian so sánh" + modification_label: "Được sửa đổi trong khoảng thời gian so sánh" + column_incompatible: "Cột này không hiển thị các thay đổi trong chế độ Đường cơ sở." filters: title: "Lọc gói công việc" - baseline_incompatible: "Thuộc tính bộ lọc này không được tính đến trong chế độ Baseline." - baseline_warning: "Chế độ Baseline đã được bật nhưng một số bộ lọc đang hoạt động của bạn không được đưa vào so sánh." + baseline_incompatible: "Thuộc tính bộ lọc này không được xem xét trong chế độ Đường cơ sở." + baseline_warning: "Chế độ cơ sở đang bật nhưng một số bộ lọc đang hoạt động của bạn không được đưa vào so sánh." inline_create: - title: "Click vào đây để thêm một work package mới vào danh sách này" + title: "Bấm vào đây để thêm gói công việc mới vào danh sách này" create: title: "Work package mới" header: "Mới %{type}" @@ -869,72 +867,72 @@ vi: header_with_parent: "Mới %{type} (Con của %{parent_type} #%{id})" button: "Tạo mới" duplicate: - title: "Duplicate work package" + title: "Gói công việc trùng lặp" hierarchy: show: "Hiển thị chế độ phân cấp" hide: "Ẩn chế độ phân cấp" toggle_button: "Nhấp để chuyển đổi chế độ phân cấp." - leaf: "Gói công việc lá ở cấp %{level}." - children_collapsed: "Mức phân cấp %{level}, bị thu gọn. Nhấp để hiển thị các con đã lọc" - children_expanded: "Mức phân cấp %{level}, đã mở rộng. Nhấp để thu gọn các con đã lọc" + leaf: "Lá gói công việc ở cấp độ %{level}." + children_collapsed: "Cấp bậc phân cấp %{level}, đã sụp đổ. Nhấn vào đây để hiển thị những đứa trẻ được lọc" + children_expanded: "Cấp độ phân cấp %{level}, được mở rộng. Bấm để thu gọn các con đã lọc" faulty_query: - title: Không thể tải gói công việc. - description: Trình bày của bạn là sai và không thể được xử lý. + title: Không thể tải các gói công việc. + description: Chế độ xem của bạn bị sai và không thể xử lý được. no_results: - title: Không có gói công việc để hiển thị. - description: Không có gì được tạo ra hoặc tất cả các gói công việc đã được lọc. - limited_results: Chỉ có %{count} gói công việc có thể hiển thị trong chế độ sắp xếp thủ công. Vui lòng giảm số lượng kết quả bằng cách lọc, hoặc chuyển sang chế độ sắp xếp tự động. + title: Không có gói công việc nào để hiển thị. + description: Không có gói nào được tạo hoặc tất cả các gói công việc đều bị lọc ra. + limited_results: Chỉ các gói công việc %{count} mới có thể được hiển thị ở chế độ sắp xếp thủ công. Vui lòng giảm kết quả bằng cách lọc hoặc chuyển sang sắp xếp tự động. property_groups: - details: "Chi tiết" - people: "Người" - estimatesAndTime: "Ước tính thời gian &" - other: "Khác" + details: "chi tiết" + people: "mọi người" + estimatesAndTime: "Ước tính & Thời gian" + other: "khác" properties: - assignee: "Người được giao" - author: "Tác giả" - createdAt: "Tạo ngày" - description: "Mô tả" - date: "Ngày" + assignee: "Người được chuyển nhượng" + author: "tác giả" + createdAt: "Được tạo vào" + description: "mô tả" + date: "ngày" percentComplete: "% Hoàn thành" - percentCompleteAlternative: "Tiến độ" + percentCompleteAlternative: "tiến bộ" dueDate: "Ngày kết thúc" - duration: "Thời gian" - spentTime: "Thời gian" - category: "Thể loại" + duration: "thời lượng" + spentTime: "dành thời gian" + category: "thể loại" percentageDone: "Phần trăm hoàn thành" - priority: "Độ ưu tiên" - projectName: "Dự án" + priority: "ưu tiên" + projectName: "dự án" remainingWork: "Công việc còn lại" remainingWorkAlternative: "Số giờ còn lại" - responsible: "Chịu trách nhiệm" + responsible: "chịu trách nhiệm" startDate: "Ngày bắt đầu" - status: "Trạng thái" + status: "trạng thái" subject: "Chủ đề" - subproject: "Dự án con" - title: "Tiêu đề" - type: "Kiểu" - updatedAt: "Được cập nhật vào lúc" + subproject: "dự án con" + title: "tiêu đề" + type: "loại" + updatedAt: "Đã cập nhật vào" versionName: "Phiên bản" version: "Phiên bản" - work: "Công việc" + work: "làm việc" workAlternative: "Thời gian dự kiến" remainingTime: "Công việc còn lại" default_queries: manually_sorted: "Truy vấn được sắp xếp thủ công mới" latest_activity: "Hoạt động mới nhất" - created_by_me: "Do tôi tạo ra" - assigned_to_me: "Được phân công cho tôi" - recently_created: "Đã được tạo gần đây" - all_open: "Mở tất cả" - overdue: "Quá hạn" + created_by_me: "Được tạo bởi tôi" + assigned_to_me: "Đã giao cho tôi" + recently_created: "Được tạo gần đây" + all_open: "Tất cả đều mở" + overdue: "quá hạn" summary: "Tóm tắt" - shared_with_users: "Chia sẻ với người dùng" - shared_with_me: "Chia sẻ với tôi" + shared_with_users: "Được chia sẻ với người dùng" + shared_with_me: "Đã chia sẻ với tôi" jump_marks: - pagination: "Viet nam" - label_pagination: "Viet Nam" - content: "Nhảy đến nội dung" - label_content: "Nhấp vào đây để bỏ qua menu và đến nội dung" + pagination: "Chuyển đến phân trang bảng" + label_pagination: "Bấm vào đây để bỏ qua bảng gói công việc và chuyển sang phân trang" + content: "Chuyển đến nội dung" + label_content: "Nhấn vào đây để bỏ qua menu và đi tới nội dung" placeholders: default: "-" date: "Chọn ngày" @@ -942,8 +940,8 @@ vi: column_names: "Cột" group_by: "Nhóm kết quả bởi" group: "Nhóm theo" - group_by_disabled_by_hierarchy: "Nhóm theo bị vô hiệu hóa do chế độ phân cấp đang hoạt động." - hierarchy_disabled_by_group_by: "Chế độ phân cấp bị vô hiệu hóa do kết quả được nhóm theo %{column}." + group_by_disabled_by_hierarchy: "Nhóm theo bị tắt do chế độ phân cấp đang hoạt động." + hierarchy_disabled_by_group_by: "Chế độ phân cấp bị tắt do kết quả được nhóm theo %{column}." sort_ascending: "Sắp xếp tăng dần" sort_descending: "Sắp xếp giảm dần" move_column_left: "Di chuyển cột sang trái" @@ -952,162 +950,162 @@ vi: insert_columns: "Chèn cột" filters: "Bộ lọc" display_sums: "Hiển thị tổng" - confirm_edit_cancel: "Bạn có chắc bạn muốn hủy bỏ chỉnh sửa tên của trình bày này? Tiêu đề sẽ được đặt trở về giá trị trước đó." + confirm_edit_cancel: "Bạn có chắc chắn muốn hủy chỉnh sửa tên của chế độ xem này không? Tiêu đề sẽ được đặt trở lại giá trị trước đó." click_to_edit_query_name: "Nhấp vào chỉnh sửa tiêu đề của trình bày này." rename_query_placeholder: "Tên của trình bày" star_text: "Đánh dấu chế độ xem này là yêu thích và thêm vào thanh bên chế độ xem đã lưu ở bên trái." public_text: > - Công khai chế độ xem này, cho phép người dùng khác truy cập chế độ xem của bạn. Người dùng có quyền 'Quản lý chế độ xem công khai' có thể chỉnh sửa hoặc xóa truy vấn công khai. Điều này không ảnh hưởng đến khả năng nhìn thấy kết quả gói công việc trong chế độ xem đó và tùy thuộc vào quyền của họ, người dùng có thể thấy các kết quả khác nhau. + Xuất bản chế độ xem này, cho phép người dùng khác truy cập vào chế độ xem của bạn. Người dùng có quyền 'Quản lý chế độ xem công khai' có thể sửa đổi hoặc xóa truy vấn công khai. Điều này không ảnh hưởng đến khả năng hiển thị của kết quả gói công việc trong chế độ xem đó và tùy thuộc vào quyền của họ, người dùng có thể thấy các kết quả khác nhau. errors: unretrievable_query: "Không thể đọc trình bày từ URL" - not_found: "Không có trình bày nào đã được tạo ra" - duplicate_query_title: "Tên trình bày đã có, Bạn có muốn thay đổi không?" + not_found: "Không có quan điểm như vậy" + duplicate_query_title: "Tên của chế độ xem này đã tồn tại. Dù sao cũng thay đổi?" text_no_results: "Không chuyên mục nào được tìm thấy." reminders: - button_label: "Set reminder" + button_label: "Đặt lời nhắc" title: - new: "Set a reminder" - edit: "Edit reminder" - subtitle: "You will receive a notification for this work package at the chosen time." + new: "Đặt lời nhắc" + edit: "Chỉnh sửa lời nhắc" + subtitle: "Bạn sẽ nhận được thông báo về gói công việc này vào thời điểm đã chọn." presets: - tomorrow: "Tomorrow" - three_days: "In 3 days" - week: "In a week" - month: "In a month" - custom: "At a particular date/time" + tomorrow: "Ngày mai" + three_days: "trong 3 ngày" + week: "trong một tuần" + month: "trong một tháng" + custom: "Vào một ngày/giờ cụ thể" scheduling: - is_parent: "Ngày của gói công việc này được suy ra tự động từ các con của nó. Kích hoạt 'Lên lịch thủ công' để đặt ngày." - is_switched_from_manual_to_automatic: "Ngày của gói công việc này có thể cần phải được tính toán lại sau khi chuyển từ lên lịch thủ công sang tự động do mối quan hệ với các gói công việc khác." + is_parent: "Ngày của gói công việc này được tự động suy ra từ các phần tử con của nó. Kích hoạt 'Lập lịch thủ công' để đặt ngày." + is_switched_from_manual_to_automatic: "Ngày của gói công việc này có thể cần được tính toán lại sau khi chuyển từ lập lịch thủ công sang lập lịch tự động do mối quan hệ với các gói công việc khác." sharing: title: "Chia sẻ gói công việc" - show_all_users: "Hiển thị tất cả người dùng mà gói công việc đã được chia sẻ" + show_all_users: "Hiển thị tất cả người dùng đã được chia sẻ gói công việc" table: configure_button: "Cấu hình bảng gói công việc" - summary: "Bảng với hàng work package và cột của các thuộc tính work package." + summary: "Bảng có các hàng gói công việc và các cột thuộc tính gói công việc." text_inline_edit: "Hầu hết các ô của bảng này là các nút kích hoạt chức năng chỉnh sửa nội tuyến của thuộc tính đó." - text_sort_hint: "Với các liên kết trong các tiêu đề bảng bạn có thể sắp xếp, nhóm, sắp xếp lại, loại bỏ và thêm bảng cột." - text_select_hint: "Các hộp chọn nên được mở bằng 'ALT' và các phím mũi tên." + text_sort_hint: "Với các liên kết trong tiêu đề bảng, bạn có thể sắp xếp, nhóm, sắp xếp lại, xóa và thêm các cột trong bảng." + text_select_hint: "Các hộp chọn phải được mở bằng 'ALT' và phím mũi tên." table_configuration: - button: "Cấu hình bảng gói công việc này" - choose_display_mode: "Hiển thị gói công việc dưới dạng" + button: "Định cấu hình bảng gói công việc này" + choose_display_mode: "Hiển thị các gói công việc dưới dạng" modal_title: "Bảng cấu hình gói công việc" - embedded_tab_disabled: "Tab cấu hình này không khả dụng cho chế độ xem nhúng mà bạn đang chỉnh sửa." + embedded_tab_disabled: "Tab cấu hình này không có sẵn cho chế độ xem được nhúng mà bạn đang chỉnh sửa." default: "mặc định" display_settings: "Cài đặt hiển thị" default_mode: "Danh sách phẳng" hierarchy_mode: "Hệ thống phân cấp" - hierarchy_hint: "Tất cả các bảng được lọc sẽ được gắn với tiền bối của nó. Cây công việc có thể đươc mở ra hoặc thu lại." - display_sums_hint: "Hiển thị tổng của các cột số trong một hàng phía dưới bảng kết quả." - show_timeline_hint: "Hiển thị biểu đồ grantt ở bên phải của bảng. Bạn có thể thay đổi độ rộng của nó bằng cách kéo thanh chia giữa bảng và biểu đồ grantt." - highlighting: "Tô sáng" + hierarchy_hint: "Tất cả các kết quả bảng đã lọc sẽ được tăng cường với tổ tiên của chúng. Hệ thống phân cấp có thể được mở rộng và thu gọn." + display_sums_hint: "Hiển thị tổng của tất cả các thuộc tính có thể tính tổng trong một hàng bên dưới kết quả của bảng." + show_timeline_hint: "Hiển thị biểu đồ gantt tương tác ở phía bên phải của bảng. Bạn có thể thay đổi độ rộng của nó bằng cách kéo dải phân cách giữa bảng và biểu đồ gantt." + highlighting: "Làm nổi bật" highlighting_mode: - description: "Đánh dấu bằng màu sắc" - none: "Không tô sáng" - inline: "Thuộc tính(s) được tô sáng" + description: "Làm nổi bật bằng màu sắc" + none: "Không làm nổi bật" + inline: "(Các) thuộc tính được đánh dấu" inline_all: "Tất cả thuộc tính" - entire_row_by: "Toàn bộ hàng theo" - status: "Trạng thái" - priority: "Độ ưu tiên" - type: "Kiểu" + entire_row_by: "Toàn bộ hàng bởi" + status: "trạng thái" + priority: "ưu tiên" + type: "loại" sorting_mode: - description: "Chọn chế độ sắp xếp gói công việc của bạn:" - automatic: "Tự động" - manually: "Thủ công" - warning: "Bạn sẽ mất sắp xếp trước đó khi kích hoạt chế độ sắp xếp tự động." - columns_help_text: "Sử dụng trường đầu vào phía trên để thêm cột vào chế độ xem bảng của bạn. Bạn có thể kéo và thả các cột để thay đổi thứ tự của chúng." + description: "Chọn chế độ sắp xếp các gói Công việc của bạn:" + automatic: "tự động" + manually: "thủ công" + warning: "Bạn sẽ mất cách sắp xếp trước đó khi kích hoạt chế độ sắp xếp tự động." + columns_help_text: "Sử dụng trường nhập ở trên để thêm cột vào chế độ xem bảng của bạn. Bạn có thể kéo và thả các cột để sắp xếp lại chúng." relation_filters: filter_work_packages_by_relation_type: "Lọc các gói công việc theo loại quan hệ" tabs: - overview: Tổng quan - activity: Hoạt động - relations: Các mối quan hệ - watchers: Người theo dõi - files: Tập tin + overview: tổng quan + activity: hoạt động + relations: quan hệ + watchers: người theo dõi + files: tập tin time_relative: days: "ngày" weeks: "tuần" - months: "tháng" + months: "Tháng" toolbar: settings: - configure_view: "Cấu hình chế độ xem" + configure_view: "Định cấu hình chế độ xem" columns: "Cột" sort_by: "Sắp xếp theo" group_by: "Nhóm theo" display_sums: "Hiển thị tổng" - display_hierarchy: "Hiển thị phân cấp" - hide_hierarchy: "Ẩn phân cấp" - hide_sums: "Ẩn tổng" - save: "Lưu" + display_hierarchy: "Hiển thị thứ bậc" + hide_hierarchy: "Ẩn thứ bậc" + hide_sums: "Ẩn số tiền" + save: "lưu lại" save_as: "Lưu dưới dạng" - export: "Xuất" + export: "xuất khẩu" visibility_settings: "Cài đặt hiển thị" share_calendar: "Đăng ký lịch" page_settings: "Đổi tên trang" - delete: "Xoá" - filter: "Bộ lọc" + delete: "xóa" + filter: "bộ lọc" unselected_title: "Work Package" search_query_label: "Tìm trang đã lưu" modals: - label_name: "Tên" + label_name: "tên" label_delete_page: "Xóa trang hiện tại" button_apply: "Áp dụng" - button_save: "Lưu" + button_save: "lưu lại" button_submit: "Gửi" - button_cancel: "Hủy" - button_delete: "Xoá" + button_cancel: "Hủy bỏ" + button_delete: "xóa" form_submit: title: "Xác nhận để tiếp tục" text: "Bạn có thực sự muốn thực hiện thao tác này?" destroy_work_package: title: "Xác nhận xóa %{label}" single_text: "Bạn có chắc chắn muốn xóa gói công việc" - bulk_text: "Bạn có chắc chắn muốn xóa các %{label} sau đây?" + bulk_text: "Bạn có chắc chắn muốn xóa %{label} sau đây không?" has_children: "Gói công việc có %{childUnits}:" - confirm_deletion_children: "Tôi công nhận rằng TẤT CẢ các con của các gói công việc được liệt kê sẽ bị xóa đệ quy." - deletes_children: "Các gói công việc con cũng sẽ bị xóa theo." + confirm_deletion_children: "Tôi xác nhận rằng TẤT CẢ các gói công việc kế thừa được liệt kê sẽ bị xóa đệ quy." + deletes_children: "Tất cả các gói công việc con và con cháu của chúng cũng sẽ bị xóa đệ quy." destroy_time_entry: - title: "Xác nhận xóa mục thời gian" - text: "Bạn có chắc chắn muốn xóa mục thời gian sau đây không?" - notice_no_results_to_display: "Không có kết quả để hiển thị." - notice_successful_create: "Tạo thành công." + title: "Xác nhận xóa mục nhập thời gian" + text: "Bạn có chắc chắn muốn xóa mục nhập thời gian sau đây không?" + notice_no_results_to_display: "Không có kết quả có thể nhìn thấy để hiển thị." + notice_successful_create: "Sáng tạo thành công." notice_successful_delete: "Xóa thành công." notice_successful_update: "Cập nhật thành công." - notice_job_started: "Công việc đã bắt đầu." - no_job_id: "No job ID returned from server." - invalid_job_response: "Invalid response from server." - notice_bad_request: "Yêu cầu không hợp lệ." + notice_job_started: "công việc bắt đầu." + no_job_id: "Không có ID công việc nào được trả về từ máy chủ." + invalid_job_response: "Phản hồi không hợp lệ từ máy chủ." + notice_bad_request: "Yêu cầu xấu." relations: - empty: Không tồn tại mối quan hệ + empty: Không có mối quan hệ nào tồn tại remove: Loại bỏ các mối quan hệ inplace: button_edit: "%{attribute}: Sửa" button_save: "%{attribute}: Lưu" button_cancel: "%{attribute}: Hủy" - button_save_all: "Lưu" - button_cancel_all: "Hủy" - link_formatting_help: "Định dạng văn bản trợ giúp" + button_save_all: "lưu lại" + button_cancel_all: "Hủy bỏ" + link_formatting_help: "Trợ giúp định dạng văn bản" btn_preview_enable: "Xem trước" btn_preview_disable: "Tắt xem trước" null_value_label: "Không có giá trị" clear_value_label: "-" errors: - required: "%{field} không thể để trống" + required: "%{field} không được để trống" number: "%{field} không phải là số hợp lệ" - maxlength: "%{field} không thể chứa hơn %{maxLength} digit(s)" - minlength: "%{field} không thể chứa ít hơn %{minLength} digit(s)" + maxlength: "%{field} không thể chứa nhiều hơn %{maxLength} chữ số" + minlength: "%{field} không thể chứa ít hơn %{minLength} chữ số" messages_on_field: "Mục này không hợp lệ: %{messages}" - error_could_not_resolve_version_name: "Không thể phân giải tên phiên bản" + error_could_not_resolve_version_name: "Không thể giải quyết tên phiên bản" error_could_not_resolve_user_name: "Không thể phân giải tên người dùng" - error_attachment_upload: "Tập tin tải lên thất bại.%{error}" + error_attachment_upload: "Không thể tải lên tệp: %{error}" error_attachment_upload_permission: "Bạn không có quyền tải lên tập tin vào tài nguyên này." units: workPackage: - other: "công việc" + other: "gói công việc" child_work_packages: - other: "%{count} tác phẩm gói phần mềm trẻ em" - hour_string: "%{hours} h" + other: "%{count} gói công việc trẻ em" + hour_string: "%{hours} giờ" hour: - one: "1 h" + one: "1 giờ" other: "%{count} giờ" zero: "0 giờ" day: @@ -1122,97 +1120,97 @@ vi: global_search: all_projects: "Cho tất cả các dự án" close_search: "Đóng tìm kiếm" - items_available: "%{count} items available" - direct_hit_available: "Work package with exact ID found. Press Enter to open it." - current_project_and_all_descendants: "Trong dự án này + các dự án con" + items_available: "%{count} mặt hàng có sẵn" + direct_hit_available: "Gói công việc có ID chính xác được tìm thấy. Nhấn Enter để mở nó." + current_project_and_all_descendants: "Trong dự án này + các tiểu dự án" current_project: "Trong dự án này" recently_viewed: "Đã xem gần đây" - search_placeholder_expanded: "Search work packages by subject, project, type, status or ID" + search_placeholder_expanded: "Tìm kiếm các gói công việc theo chủ đề, dự án, loại, trạng thái hoặc ID" title: all_projects: "mọi dự án" - project_and_subprojects: "và tất cả các dự án con" + project_and_subprojects: "và tất cả các tiểu dự án" search_for: "Tìm kiếm" views: - card: "Thẻ" - list: "Bảng" - timeline: "Biểu đồ sự kiện" + card: "thẻ" + list: "bàn" + timeline: "Gantt" invite_user_modal: invite: "Mời" - placeholder_add_tag: "Create placeholder user" + placeholder_add_tag: "Tạo người dùng giữ chỗ" exclusion_info: modal: - title: "Trạng thái loại trừ khỏi tổng hợp phân cấp" + title: "Trạng thái bị loại trừ khỏi tổng số thứ bậc" content: >- - Trạng thái '%{status_name}' đã được cấu hình để loại trừ khỏi tổng hợp của Công việc, Công việc còn lại và % Hoàn thành. Các tổng hợp không tính đến giá trị này. + Trạng thái '%{status_name}' đã được định cấu hình để loại trừ khỏi tổng số Công việc, Công việc còn lại và % Đã hoàn thành theo thứ bậc. Tổng số không tính đến giá trị này. favorite_projects: - no_results: "Bạn không có dự án yêu thích" - no_results_subtext: "Thêm một hoặc nhiều dự án yêu thích thông qua cái nhìn tổng quan hoặc trong danh sách dự án." + no_results: "Bạn không có dự án yêu thích nào" + no_results_subtext: "Thêm một hoặc nhiều dự án yêu thích thông qua phần tổng quan hoặc trong danh sách dự án." include_projects: - toggle_title: "Bao gồm dự án" - title: "Các dự án" + toggle_title: "Bao gồm các dự án" + title: "dự án" clear_selection: "Xóa lựa chọn" apply: "Áp dụng" selected_filter: all: "Tất cả dự án" - selected: "Chỉ các dự án được chọn" - search_placeholder: "Search projects..." - search_placeholder_favorites: "Search favorites..." - include_subprojects: "Bao gồm tất cả các dự án con" + selected: "Chỉ được chọn" + search_placeholder: "Tìm kiếm dự án..." + search_placeholder_favorites: "Tìm kiếm yêu thích..." + include_subprojects: "Bao gồm tất cả các tiểu dự án" tooltip: - include_all_selected: "Dự án đã được bao gồm vì đã bật Bao gồm tất cả các dự án con." - current_project: "Đây là dự án hiện tại của bạn." - does_not_match_search: "Dự án không khớp với tiêu chí tìm kiếm." - no_results: "Không có dự án nào khớp với tiêu chí tìm kiếm của bạn." - no_favorite_results: "No favorite project matches your search criteria." + include_all_selected: "Dự án đã được đưa vào kể từ khi tính năng Bao gồm tất cả các dự án con được bật." + current_project: "Đây là dự án hiện tại bạn đang tham gia." + does_not_match_search: "Dự án không phù hợp với tiêu chí tìm kiếm." + no_results: "Không có dự án nào phù hợp với tiêu chí tìm kiếm của bạn." + no_favorite_results: "Không có dự án yêu thích nào phù hợp với tiêu chí tìm kiếm của bạn." include_workspaces: - search_placeholder: "Search..." + search_placeholder: "Tìm kiếm..." types: - program: "Program" - portfolio: "Portfolio" + program: "chương trình" + portfolio: "danh mục đầu tư" baseline: - toggle_title: "Cơ sở" + toggle_title: "Đường cơ sở" clear: "Xóa" apply: "Áp dụng" - header_description: "Nổi bật các thay đổi đã thực hiện đối với danh sách này kể từ bất kỳ thời điểm nào trong quá khứ." + header_description: "Đánh dấu những thay đổi được thực hiện trong danh sách này kể từ bất kỳ thời điểm nào trong quá khứ." show_changes_since: "Hiển thị các thay đổi kể từ" - help_description: "Múi giờ tham chiếu cho cơ sở." + help_description: "Múi giờ tham chiếu cho đường cơ sở." time_description: "Theo giờ địa phương của bạn: %{datetime}" - time: "Thời gian" - from: "Từ" - to: "Đến" + time: "thời gian" + from: "từ" + to: "đến" drop_down: none: "-" yesterday: "hôm qua" - last_working_day: "ngày làm việc gần nhất" + last_working_day: "ngày làm việc cuối cùng" last_week: "tuần trước" last_month: "tháng trước" a_specific_date: "một ngày cụ thể" between_two_specific_dates: "giữa hai ngày cụ thể" legends: - changes_since: "Thay đổi kể từ" + changes_since: "Những thay đổi kể từ" changes_between: "Thay đổi giữa" - now_meets_filter_criteria: "Hiện tại đáp ứng tiêu chí lọc" + now_meets_filter_criteria: "Bây giờ đáp ứng tiêu chí lọc" no_longer_meets_filter_criteria: "Không còn đáp ứng tiêu chí lọc" - maintained_with_changes: "Duy trì với các thay đổi" - in_your_timezone: "Theo múi giờ của bạn:" + maintained_with_changes: "Duy trì với những thay đổi" + in_your_timezone: "Trong múi giờ địa phương của bạn:" icon_tooltip: added: "Đã thêm vào chế độ xem trong khoảng thời gian so sánh" - removed: "Đã xóa khỏi chế độ xem trong khoảng thời gian so sánh" - changed: "Duy trì với các thay đổi" + removed: "Đã bị xóa khỏi chế độ xem trong khoảng thời gian so sánh" + changed: "Được duy trì với các sửa đổi" forms: submit_success_message: "Form đã được gửi thành công" - load_error_message: "Đã có lỗi trong khi tải form" - validation_error_message: "Vui lòng sửa lỗi có trong mẫu" + load_error_message: "Đã xảy ra lỗi khi tải biểu mẫu" + validation_error_message: "Vui lòng sửa các lỗi có trong biểu mẫu" advanced_settings: "Cài đặt nâng cao" spot: filter_chip: remove: "Xóa" drop_modal: - focus_grab: "Đây là điểm tập trung cho các modal. Nhấn shift+tab để quay lại phần tử kích hoạt modal." - close: "Đóng modal" + focus_grab: "Đây là điểm neo tập trung cho các phương thức. Nhấn shift+tab để quay lại phần tử kích hoạt phương thức." + close: "Đóng phương thức" open_project_storage_modal: waiting_title: - timeout: "Hết thời gian" + timeout: "Hết giờ" waiting_subtitle: - network_off: "Có vấn đề về mạng." - network_on: "Mạng đã trở lại. Chúng tôi đang thử lại." + network_off: "Có một vấn đề về mạng." + network_on: "Mạng đã trở lại. Chúng tôi đang cố gắng." diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml index ad8942d9aa3..f00fe4c05ce 100644 --- a/config/locales/crowdin/js-zh-CN.yml +++ b/config/locales/crowdin/js-zh-CN.yml @@ -203,8 +203,8 @@ zh-CN: add_table: "添加相关工作包表" edit_query: "编辑查询" new_group: "新建组" - delete_group: "Delete group" - remove_attribute: "Remove from group" + delete_group: "删除群组" + remove_attribute: "从群组中移除" reset_to_defaults: "重置为默认值" working_days: calendar: @@ -426,7 +426,7 @@ zh-CN: label_remove_row: "移除行" label_report: "报告" label_repository_plural: "存储库" - label_resize_project_menu: "Resize project menu" + label_resize_project_menu: "调整项目菜单大小" label_save_as: "另存为" label_search_columns: "搜索列" label_select_watcher: "选择一个关注者..." @@ -632,9 +632,6 @@ zh-CN: add: "为项目添加设置" already_selected: "此项目已经选定" remove: "移除项目设置" - password_confirmation: - field_description: "输入密码以确认更改" - title: "输入密码以继续" pagination: no_other_page: "您位于唯一页面上。" pages_skipped: "跳过的页面。" diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml index affdc647a77..6bc3968e698 100644 --- a/config/locales/crowdin/js-zh-TW.yml +++ b/config/locales/crowdin/js-zh-TW.yml @@ -631,9 +631,6 @@ zh-TW: add: "新增設定" already_selected: "已選取此專案" remove: "移除專案設定" - password_confirmation: - field_description: "您需要輸入您的帳戶密碼,以確認此更改。" - title: "確認您的密碼以便繼續" pagination: no_other_page: "您位於唯一頁面上。" pages_skipped: "跳過的頁面。" diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 99adc2b0865..c10de281663 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -109,6 +109,23 @@ ka: 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." link: "ვებჰუკი" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ ka: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ ka: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ ka: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ ka: create_button: "შექმნა" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ ka: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ ka: onthefly: "Automatic user creation" port: "პორტი" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "როლები" notification: @@ -1489,6 +1520,7 @@ ka: even: "ლუწი უნდა იყოს" exclusion: "დაცულია." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ ka: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ ka: token/api: one: Access token other: წვდომის კოდები - type: "ტიპი" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "მომხმარებელი" version: "ვერსია" workflow: "სამუშაო პროცესი" @@ -2136,6 +2174,7 @@ ka: button_click_to_reveal: "Click to reveal" button_close: "დახურვა" button_collapse_all: "ყველას ჩაკეცვა" + button_confirm: "Confirm" button_configure: "მორგება" button_continue: "გაგრძელება" button_complete: "Complete" @@ -2168,6 +2207,7 @@ ka: button_print: "ბეჭდვა" button_quote: "ციტატა" button_remove: წაშლა + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "გადარქმევა" button_replace: "ჩანაცვლება" @@ -2419,7 +2459,7 @@ ka: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ ka: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ ka: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ ka: custom_actions: title: "მორგებული ქმედებები" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ ka: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ ka: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ ka: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "აგრეგაცია" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ ka: expiration: "ვადა" indefinite_expiration: "არასოდეს" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." + static_token_name: "API token" disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: - static_token_name: "API კოდი" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." - static_token_name: "RSS კოდი" + static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "ფაილების საცავი" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ ka: label_always_visible: "Always displayed" label_announcement: "მნიშვნელოვანი ინფორმაცია" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API-ის წვდომის გასაღები" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ ka: label_journal_diff: "Description Comparison" label_language: "ენა" label_languages: "ენები" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "საკვანძო სიტყვები" @@ -3430,9 +3501,6 @@ ka: label_project_hierarchy: "Project hierarchy" label_project_mappings: "პროექტები" label_project_new: "ახალი პროექტი" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "პროექტები" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ ka: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ ka: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ ka: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "დოკუმენტაცია" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ ka: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ ka: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ ka: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ ka: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 47f6533b507..7a227ae4b52 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -109,6 +109,23 @@ kk: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ kk: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ kk: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ kk: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ kk: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ kk: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ kk: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ kk: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ kk: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ kk: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ kk: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ kk: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ kk: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ kk: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ kk: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ kk: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ kk: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ kk: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ kk: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ kk: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ kk: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ kk: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ kk: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ kk: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ kk: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ kk: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ kk: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ kk: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ kk: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ kk: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 50d9e4c67b5..bda826a411e 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -109,6 +109,23 @@ ko: explanation: text: "사용자의 개별 작업(예: 작업 패키지를 두 번 업데이트)은 연령 차이가 지정된 기간 미만인 경우 단일 작업으로 집계됩니다. 애플리케이션 내에서 단일 작업으로 표시됩니다. 또한 이는 전송되는 이메일 수를 줄이는 동일한 시간만큼 알림을 지연시키고 %{webhook_link} 지연에도 영향을 미칩니다." link: "webhook" + mcp_configurations: + index: + description: "모델 컨텍스트 프로토콜을 통해 AI 에이전트는 이 OpenProject 인스턴스에 의해 노출된 도구와 리소스를 사용자에게 제공할 수 있습니다." + resources_heading: "리소스" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "리소스 업데이트" + tools_heading: "도구" + tools_description: "OpenProject는 다음 도구를 구현합니다. 원하는 대로 각 도구를 활성화하고, 이름을 바꾸고, 설명할 수 있습니다. 자세한 내용은 [MCP 도구의 문서](docs_url)를 참조하세요." + tools_submit: "도구 업데이트" + multi_update: + success: "MCP 구성이 업데이트되었습니다." + server_form: + description_caption: "MCP 서버에 연결하는 다른 애플리케이션에 대해 MCP 서버가 설명되는 방식입니다." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP 구성을 업데이트할 수 없습니다." + success: "MCP 구성이 업데이트되었습니다." scim_clients: authentication_methods: sso: "ID 공급자의 JWT" @@ -590,6 +607,7 @@ ko: is_for_all_blank_slate: heading: 모든 프로젝트용 description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 프로젝트 특성이 활성화되었습니다. 개별 프로젝트에 대해 비활성화할 수 없습니다.' + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: 사용 가능한 타입이 없습니다. form: @@ -604,6 +622,9 @@ ko: work_package_priorities: new_label: "새로운 우선 순위" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "생성된 아티팩트는 아티팩트 작업 패키지에 PDF 첨부 파일로 저장됩니다." description_file_link_export: "아티팩트 작업 패키지에는 외부 파일 저장소에 저장된 PDF에 대한 파일 링크가 있습니다. 이 프로젝트에 대해 자동으로 관리되는 프로젝트 폴더가 있는 작업 파일 저장소가 필요합니다. 현재는 Nextcloud 파일 저장소만 지원됩니다." @@ -617,6 +638,7 @@ ko: label_request_submission: "요청 제출" project_attributes_description: > 프로젝트 시작 요청에 포함해야 하는 프로젝트 특성을 선택합니다. 이 목록에는 해당 프로젝트에 대해 활성화된 [프로젝트 특성](project_attributes_url)만 포함됩니다. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: 상태 편집 wizard: @@ -706,9 +728,11 @@ ko: create_button: "만들기" name_label: "토큰 이름" created_dialog: + one_time_warning: "이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다." token/api: title: "API 토큰이 생성되었습니다" - warning: "이번에만 이 토큰이 표시됩니다. 지금 이 토큰을 복사해야 합니다." + token/rss: + title: "RSS 토큰이 생성되었습니다" failed_to_reset_token: "액세스 토큰을 재설정하지 못함: %{error}" failed_to_create_token: "액세스 토큰을 만들지 못했습니다: %{error}" failed_to_revoke_token: "액세스 토큰을 취소하지 못했습니다: %{error}" @@ -718,6 +742,9 @@ ko: notice_api_token_revoked: "API 토큰이 삭제되었습니다. 새 토큰을 만들려면 API 섹션의 버튼을 사용하세요." notice_rss_token_revoked: "RSS 토큰이 삭제되었습니다. 새 토큰을 만들려면 RSS 섹션의 링크를 사용하세요." notice_ical_token_revoked: '"%{project_name}" 프로젝트의 "%{calendar_name}" 캘린더에 대한 iCalendar 토큰 "%{token_name}"이(가) 취소되었습니다. 이 토큰이 포함된 iCalendar URL이 이제 유효하지 않습니다.' + password_confirmation_dialog: + confirmation_required: "이 변경 내용을 확인하려면 계정 암호를 입력해야 합니다." + title: "계속하려면 암호 확인" news: index: no_results_title_text: 보고할 소식이 없습니다. @@ -1222,6 +1249,10 @@ ko: onthefly: "자동 사용자 생성" port: "포트" tls_certificate_string: "LDAP 서버 SSL 인증서" + mcp_configuration: + enabled: 활성화됨 + title: 제목 + description: 설명 member: roles: "역할" notification: @@ -1480,6 +1511,7 @@ ko: even: "에 짝수를 입력해 주세요" exclusion: "예약됨" feature_disabled: '- 사용할 수 없습니다.' + feature_disabled_for_project: '- 이 프로젝트에서 비활성화되었습니다.' file_too_large: "은(는) 너무 큽니다. (최대 %{count} 바이트)" filter_does_not_exist: "필터가 존재하지 않습니다." format: "- 필요한 형식 '%{expected}'과(와) 일치하지 않습니다." @@ -1502,7 +1534,8 @@ ko: not_a_datetime: "은(는) 유효한 날짜가 아닙니다." not_a_number: "은(는) 숫자가 아닙니다." not_allowed: "- 사용 권한이 없어 유효하지 않습니다." - not_json: "- 유효한 JSON 개체가 아닙니다." + not_json: "- JSON으로 구문 분석할 수 없습니다." + not_json_object: "- JSON 개체가 아닙니다." not_an_integer: "은(는) 정수가 아닙니다." not_an_iso_date: "은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD." not_same_project: "은(는) 동일한 프로젝트에 속하지 않습니다." @@ -1897,7 +1930,10 @@ ko: status: "작업 패키지 상태" token/api: other: 액세스 토큰 - type: "타입" + token/rss: + other: "RSS 토큰" + type: + other: "유형" user: "사용자" version: "버전" workflow: "워크플로" @@ -2110,6 +2146,7 @@ ko: button_click_to_reveal: "표시하려면 클릭" button_close: "닫기" button_collapse_all: "모두 축소" + button_confirm: "확인" button_configure: "구성" button_continue: "계속" button_complete: "완료" @@ -2142,6 +2179,7 @@ ko: button_print: "인쇄" button_quote: "인용" button_remove: 제거 + button_remove_permanently: "영구적으로 제거" button_remove_reminder: "미리 알림 제거" button_rename: "이름 바꾸기" button_replace: "교체하기" @@ -2373,7 +2411,7 @@ ko: baseline_comparison: 기준선 비교 board_view: 고급 보드 calculated_values: 계산된 값 - conditional_highlighting: 조건부 강조 표시 + capture_external_links: 외부 링크 캡처 internal_comments: 내부 코멘트 custom_actions: 사용자 지정 작업 custom_field_hierarchies: 계층 @@ -2383,10 +2421,12 @@ ko: edit_attribute_groups: 특성 그룹 편집 gantt_pdf_export: Gantt PDF 내보내기 ldap_groups: LDAP 사용자 및 그룹 동기화 + mcp_server: MCP 서버 nextcloud_sso: Nextcloud 저장소용 Single Sign-On one_drive_sharepoint_file_storage: OneDrive/SharePoint 파일 저장소 placeholder_users: 플레이스홀더 사용자 portfolio_management: 포트폴리오 관리 + project_creation_wizard: 프로젝트 시작 요청 project_list_sharing: 프로젝트 목록 공유 readonly_work_packages: 읽기 전용 작업 패키지 scim_api: SCIM 서버 API @@ -2427,8 +2467,8 @@ ko: description: "참조된 특성과 텍스트를 사용하여 자동으로 생성되는 제목을 만듭니다." customize_life_cycle: description: "PM2 프로젝트 사이클 계획에서 제공되는 것과는 다른 프로젝트 단계를 만들고 구성합니다." - conditional_highlighting: - description: "대다수와 차별화되는 특정 작업 패키지가 필요하신가요? 작업 패키지 테이블에서 조건부 강조 표시를 사용하세요." + capture_external_links: + description: "사용자가 외부 링크를 방문하기 전에 캡처하고 경고를 표시하여 소셜 엔지니어링 공격을 방지하세요." work_package_query_relation_columns: description: "작업 패키지 목록에서 관계 또는 자식 요소를 확인해야 하나요?" edit_attribute_groups: @@ -2458,6 +2498,8 @@ ko: custom_actions: title: "사용자 지정 작업" description: "사용자 지정 작업은 상태, 역할, 유형 또는 프로젝트를 기반으로 특정 작업 패키지에서 사용할 수 있도록 미리 정의된 작업 세트에 대한 원클릭 바로 가기입니다." + mcp_server: + description: "MCP를 통해 AI 에이전트를 OpenProject 인스턴스와 통합합니다." nextcloud_sso: title: "Nextcloud 저장소용 Single Sign-On" description: "Single Sign-On을 사용하여 Nextcloud 저장소에 대한 원활하고 안전한 인증을 활성화합니다. 액세스 관리를 간소화하고 사용자 편의성을 개선합니다." @@ -2469,6 +2511,8 @@ ko: description: "기존 ID 시스템에서 원활하게 액세스하고 통합할 수 있도록 SAML 또는 OpenID Connect를 사용하여 외부 SSO 공급자를 통해 사용자가 로그인할 수 있게 합니다." virus_scanning: description: "OpenProject에서 업로드된 파일은 바이러스 검사를 수행한 후에 다른 사용자가 액세스해야 합니다." + project_creation_wizard: + description: "프로젝트 관리자가 프로젝트 시작 요청을 작성하는 데 도움이 되는 단계별 마법사를 생성합니다." placeholder_users: title: 플레이스홀더 사용자 description: > @@ -2765,19 +2809,17 @@ ko: learn_about: "새로운 모든 기능에 대해 자세히 알아보기" missing: "아직 강조 표시된 기능이 없습니다." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > 이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. new_features_list: - line_0: 실시간 문서 공동 작업. - line_1: 관련 프로젝트를 프로그램 및 포트폴리오로 구성하여 전략적 목표에 집중할 수 있는 기능(Enterprise 추가 기능)입니다. - line_2: 초안 모드, 프레젠테이션 모드, 향상된 결과, iCal 구독으로 개선된 미팅 관리가 가능합니다. - line_3: 보다 제한적인 권한으로 SharePoint 통합이 업데이트되었습니다(Enterprise 추가 기능). - line_4: 새로운 탭, 구성 가능한 위젯, 개선된 레이아웃으로 프로젝트 개요를 새롭게 디자인했습니다. - line_5: 동일한 프로젝트에서 작업 중이지 않은 사용자의 개인 정보를 보다 엄격하게 보호하는 옵션입니다. - line_6: 향상된 템플릿 선택으로 프로젝트 생성 흐름이 개선되었습니다. - line_7: 유형과 상태를 포함한 더욱 스마트한 글로벌 검색으로 여러 자동 완성기의 정확도가 개선되었습니다. - line_8: ALT 텍스트와 개선된 차트 색상으로 접근성이 개선되었습니다. + line_0: 자동화된 프로젝트 시작(Enterprise 추가 기능). + line_1: "미팅: 새 작업 패키지 또는 기존 작업 패키지를 결과로 추가합니다." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "반복 미팅: 의제 항목을 다음 항목에 복제합니다." + line_4: "커뮤니티에 릴리스: 특성이 강조 표시됩니다." + line_5: 사용자 제공 콘텐츠에서 외부 링크를 열기 전에 표시되는 경고입니다(Enterprise 추가 기능). + line_6: 활동 탭 및 문서 모듈을 비롯한 성능 및 사용자 환경이 개선되었습니다. links: upgrade_enterprise_edition: "Enterprise Edition으로 업그레이드" postgres_migration: "설치를 PostgreSQL로 마이그레이션" @@ -2845,14 +2887,17 @@ ko: instructions_after_error: "%{signin}을(를) 클릭하여 다시 로그인해 볼 수 있습니다. 오류가 계속되면 관리자에게 도움을 요청하세요." menus: admin: - mail_notification: "이메일 알림" - mails_and_notifications: "이메일 및 알림" + ai: "인공 지능(AI)" aggregation: "집계" api_and_webhooks: "API 및 webhook" + mail_notification: "이메일 알림" + mails_and_notifications: "이메일 및 알림" + mcp_configurations: "모델 컨텍스트 프로토콜(MCP)" quick_add: label: "추가…" my_account: access_tokens: + description: "공급자 토큰은 OpenProject에서 발급하며, 다른 애플리케이션이 액세스하도록 허용합니다. 클라이언트 토큰은 다른 애플리케이션에서 발급하며, OpenProject가 액세스하도록 허용합니다." no_results: title: "표시할 수 있는 접근 토큰이 없습니다." description: "모두 비활성화 되었습니다. 관리 메뉴에서 가용 상태로 되돌릴 수 있습니다." @@ -2862,34 +2907,56 @@ ko: expiration: "만료" indefinite_expiration: "사용 안 함" simple_revoke_confirmation: "이 토큰을 취소하시겠습니까?" + tabs: + client: + title: "클라이언트 토큰" + provider: + title: "공급자 토큰" token/api: + blank_description: "아직 API 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다." + blank_title: "API 토큰 없음" title: "API" + table_title: "API 토큰" text_hint: "API 토큰을 사용하면 타사 애플리케이션이 REST API를 통해 이 OpenProject 인스턴스와 통신할 수 있습니다." + static_token_name: "API 토큰" disabled_text: "관리자가 API 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." add_button: "API 토큰" - api: - static_token_name: "API 토큰" ical: + blank_description: "iCalendar 토큰을 추가하려면 프로젝트의 캘린더 모듈 내에서 새 캘린더 또는 기존 캘린더를 구독하세요. 필요한 권한이 있어야 합니다." + blank_title: "iCalendar 토큰 없음" title: "iCalendar" + table_title: "iCalendar 토큰" text_hint_link: "iCalendar 토큰을 사용하여 사용자가 [OpenProject 캘린더를 구독](docs_url)하고 외부 클라이언트의 최신 작업 패키지 정보를 볼 수 있습니다." disabled_text: "관리자가 iCalendar 구독을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." - empty_text_hint: "iCalendar 토큰을 추가하려면 프로젝트의 캘린더 모듈 내에서 새 캘린더 또는 기존 캘린더를 구독하세요. 필요한 권한이 있어야 합니다." - oauth: + oauth_application: + active_tokens: "활성 토큰" + blank_description: "타사 애플리케이션 액세스가 구성 및 활성화되어 있지 않습니다." + blank_title: "OAuth 애플리케이션 토큰 없음" + last_used_at: "마지막 사용" title: "OAuth" - text_hint: "OAuth 토큰을 사용하면 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다." - empty_text_hint: "사용자를 위해 구성되고 활성화된 타사 애플리케이션 액세스가 없습니다. 이 기능을 활성화하려면 관리자에게 문의하세요." - rss: + table_title: "OAuth 애플리케이션 토큰" + text_hint: "OAuth 애플리케이션 토큰을 통해 타사 애플리케이션이 이 OpenProject 인스턴스와 연결할 수 있습니다." + oauth_client: + blank_description: "아직 OAuth 클라이언트 토큰이 없습니다." + blank_title: "OAuth 클라이언트 토큰 없음" + failed: "오류가 발생하여 토큰을 제거할 수 없습니다. 나중에 다시 시도하세요." + integration_type: "통합 유형" + table_title: "OAuth 클라이언트 토큰" + text_hint: "OAuth 클라이언트 토큰을 통해 이 OpenProject 인스턴스가 파일 저장소와 같은 외부 애플리케이션과 연결할 수 있습니다." + title: "OAuth" + remove_token: "이 토큰을 제거하시겠습니까? %{integration}에서 다시 로그인해야 합니다." + removed: "OAuth 클라이언트 토큰이 제거되었습니다" + unknown_integration: "알 수 없음" + token/rss: + add_button: "RSS 토큰" + blank_description: "아직 RSS 토큰이 없습니다. 아래 버튼을 사용하여 생성할 수 있습니다." + blank_title: "RSS 토큰 없음" title: "RSS" + table_title: "RSS 토큰" text_hint: "RSS 토큰을 사용하면 외부 RSS 리더를 통해 이 OpenProject 인스턴스의 최신 변경 사항을 확인할 수 있습니다." static_token_name: "RSS 토큰" disabled_text: "관리자가 RSS 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요." storages: - title: "파일 저장소" - text_hint: "파일 저장소 토큰은 이 OpenProject 인스턴스를 외부 파일 저장소에 연결합니다." - empty_text_hint: "사용자 계정에 연결된 저장소 액세스 권한이 없습니다." - revoke_token: "이 토큰을 제거하시겠습니까? %{storage}에서 다시 로그인해야 합니다." - removed: "파일 저장소 토큰이 제거되었습니다." - failed: "오류가 발생하여 토큰을 제거할 수 없습니다. 나중에 다시 시도하세요." unknown_storage: "알 수 없는 저장소" notifications: reasons: @@ -2951,6 +3018,7 @@ ko: label_always_visible: "항상 표시" label_announcement: "공지 사항" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API 액세스 키" label_api_access_key_created_on: "API 액세스 키가 %{value} 전에 생성되었습니다." label_api_access_key_type: "API" @@ -3206,6 +3274,7 @@ ko: label_journal_diff: "설명 비교" label_language: "언어" label_languages: "언어" + label_external_links: "외부 링크" label_locale: "언어 및 지역" label_jump_to_a_project: "프로젝트로 이동..." label_keyword_plural: "키워드" @@ -3383,9 +3452,6 @@ ko: label_project_hierarchy: "프로젝트 계층 구조" label_project_mappings: "프로젝트" label_project_new: "새 프로젝트" - label_project_initiation_request: "새 프로젝트 시작 요청" - label_project_creation_wizard: "새 프로젝트 생성 마법사" - label_project_mandate: "새 프로젝트 위임" label_project_plural: "프로젝트" label_project_list_plural: "프로젝트 목록" label_project_life_cycle: "프로젝트 수명 주기" @@ -3848,7 +3914,7 @@ ko: notice_not_authorized: "이 페이지에 액세스할 권한이 없습니다." notice_not_authorized_archived_project: "액세스하려는 프로젝트는 이미 보관되어 있습니다." notice_requires_enterprise_token: "Enterprise 토큰이 누락되었거나 이 페이지에 대한 액세스를 허용하지 않습니다." - notice_password_confirmation_failed: "암호가 올바르지 않습니다. 계속할 수 없습니다." + notice_password_confirmation_failed: "입력한 암호가 올바르지 않습니다." notice_principals_found_multiple: "%{number} 개의 결과가 발견되었습니다.\n첫번째 결과를 보려면 탭 해주세요." notice_principals_found_single: "한 개의 결과가 있습니다.\n보려면 탭 해주세요." notice_parent_item_not_found: "부모 항목을 찾을 수 없습니다." @@ -4197,6 +4263,9 @@ ko: setting_allowed_link_protocols: "허용된 링크 프로토콜" setting_allowed_link_protocols_text_html: >- 이러한 프로토콜이 작업 패키지 설명, 긴 텍스트 필드 및 코멘트에서 링크로 렌더링되도록 허용합니다. 예: %{tel_code} 또는 %{element_code}. 라인별로 하나의 프로토콜을 입력합니다.
    %{http_code}, %{https_code} 및 %{mailto_code} 프로토콜은 항상 허용됩니다. + setting_capture_external_links: "외부 링크 캡처" + setting_capture_external_links_text: > + 활성화된 경우, 서식이 지정된 텍스트의 모든 외부 링크는 애플리케이션을 종료하기 전에 경고 페이지를 통해 리디렉션됩니다. 따라서 잠재적인 악성 외부 웹사이트로부터 사용자를 보호할 수 있습니다. setting_after_first_login_redirect_url: "첫 번째 로그인 리디렉션" setting_after_first_login_redirect_url_text_html: > 첫 로그인 후 사용자를 리디렉션할 경로를 설정하세요. 비어 있으면 온보딩 투어의 홈페이지로 리디렉션됩니다.
    예: /my/page @@ -4209,11 +4278,17 @@ ko: setting_apiv3_cors_origins_text_html: > CORS가 활성화된 경우, OpenProject API에 액세스하도록 허용된 원본이 있습니다.
    원본 헤더의 설명서에서 예상 값 지정 방법을 확인하세요. setting_apiv3_write_readonly_attributes: "읽기 전용 특성에 대한 쓰기 액세스" - setting_apiv3_write_readonly_attributes_instructions_html: > - 활성화하면, API를 통해 관리자가 생성 중에 createdAt 및 author 등의 정적 읽기 전용 특성을 작성할 수 있습니다.
    경고: 이 설정은 데이터 가져오기 등의 사용 사례가 있지만 관리자가 다른 사용자로 가장하여 항목을 만들 수 있습니다. 그러나 모든 생성 요청은 실제 작성자와 함께 기록되고 있습니다.
    특성 및 지원되는 리소스에 대한 자세한 내용은 %{api_documentation_link}에서 참조하세요. + setting_apiv3_write_readonly_attributes_instructions: > + 활성화된 경우, API를 통해 관리자는 생성 중에 createdAt 및 author 등 정적 읽기 전용 특성을 작성할 수 있습니다. + setting_apiv3_write_readonly_attributes_warning: > + 이 설정에는 데이터 가져오기 등의 사용 사례가 있지만 관리자가 다른 사용자로 항목을 만든 것처럼 가장할 수 있습니다. 그러나 모든 생성 요청은 실제 작성자로 기록됩니다. + setting_apiv3_write_readonly_attributes_additional: > + 특성 및 지원되는 리소스에 대한 자세한 내용은 %{api_documentation_link}에서 참조하세요. setting_apiv3_max_page_size: "최대 API 페이지 크기" - setting_apiv3_max_page_instructions_html: > - API가 응답할 최대 페이지 크기를 설정하세요. 단일 페이지에서 더 많은 값을 반환하는 API 요청을 수행할 수 없습니다.
    경고: 이 값이 필요한 이유가 확실한 경우에만 이 값을 변경하세요. 높은 값으로 설정하면 성능에 상당한 영향을 미치고, 페이지당 옵션보다 낮은 값은 페이지가 매겨진 보기에서 오류를 일으킵니다. + setting_apiv3_max_page_size_instructions: > + API가 응답할 최대 페이지 크기를 설정합니다. 단일 페이지에 더 많은 값을 반환하는 API 요청은 수행할 수 없습니다. + setting_apiv3_max_page_size_warning: > + 필요한 이유가 확실한 경우에만 이 값을 변경하세요. 높은 값으로 설정하면 성능에 상당한 영향을 미치며, 페이지당 옵션보다 낮은 값은 페이지가 매겨진 보기에서 오류를 일으킵니다. setting_apiv3_docs: "설명서" setting_apiv3_docs_enabled: "문서 페이지 활성화" setting_apiv3_docs_enabled_instructions_html: > @@ -4398,7 +4473,7 @@ ko: omniauth_direct_login_hint_html: > 이 옵션이 활성화된 경우, 로그인 요청은 구성된 omniauth 공급자로 리디렉션됩니다. 로그인 드롭다운 및 로그인 페이지가 비활성화됩니다.
    참고: 또한 암호 로그인을 비활성화하지 않는 경우에는 이 옵션이 활성화된 상태에서 사용자가 %{internal_path} 로그인 페이지를 방문하여 내부에서 계속 로그인할 수 있습니다. remapping_existing_users_hint: > - 활성화된 경우, 사용자가 이전에 해당 공급자를 통해 로그인한 적이 없더라도, 구성된 모든 ID 공급자가 이메일 주소를 기반으로 기존 사용자에 로그인하도록 허용합니다. 이 옵션은 OpenProject 인스턴스를 새 SSO 공급자로 마이그레이션할 때 유용할 수 있지만 인스턴스의 일부 사용자가 신뢰하지 않는 공급자를 이용할 때는 권장되지 않습니다. + 활성화된 경우, 사용자가 이전에 해당 공급자를 통해 로그인한 적이 없더라도, 구성된 모든 ID 공급자가 사용자 이름을 기반으로 기존 사용자에 로그인하도록 허용합니다. 이 옵션은 OpenProject 인스턴스를 새 SSO 공급자로 마이그레이션할 때 유용할 수 있지만 인스턴스의 일부 사용자가 신뢰하지 않는 공급자를 이용할 때는 권장되지 않습니다. attachments: whitelist_text_html: > 업로드된 파일의 유효한 파일 확장명 및/또는 MIME 형식 목록을 정의합니다.
    파일 확장명(예: %{ext_example}) 또는 MIME 형식(예: %{mime_example})을 입력합니다.
    모든 파일 형식을 업로드할 수 있도록 허용하려면 비워 둡니다. 여러 값이 허용됩니다(각 값에 대해 한 줄). @@ -4672,6 +4747,7 @@ ko: 참고: 활성화하는 경우, %{information_panel_label} 관리 패널 및 홈페이지에서 설치 상태가 나오는 배지가 표시됩니다. 배지는 관리자에게만 표시됩니다.
    배지는 공식 OpenProject 릴리스 데이터베이스와 비교하여 현재 OpenProject 버전을 확인하고 업데이트 또는 알려진 취약성에 대해 알려줍니다. 이 검사에서 제공하는 사항, 사용 가능한 업데이트를 제공하기 위해 필요한 데이터 및 이 검사를 비활성화하는 방법에 대한 자세한 내용은 구성 문서를 참조하십시오. text_own_membership_delete_confirmation: "권한의 일부 또는 전부를 삭제하려고 합니다. 이렇게 한 후에는 이 프로젝트를 더 이상 편집하지 못할 수 있습니다.\n계속하시겠습니까?" text_permanent_delete_confirmation_checkbox_label: "이 삭제는 되돌릴 수 없음을 이해합니다." + text_permanent_remove_confirmation_checkbox_label: "이 제거는 되돌릴 수 없음을 이해합니다" text_plugin_assets_writable: "플러그인 자산 디렉터리 쓰기 가능" text_powered_by: "%{link} 제공" text_project_identifier_info: "소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다." @@ -4761,8 +4837,8 @@ ko: other: "일시적으로 잠김 (%{count} 로그인 시도 실패)" confirm_status_change: "%{name} 상태가 변경됩니다. 계속하시겠습니까?" deleted: "사용자 삭제됨" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "자신의 사용자 상태는 변경할 수 없습니다." + error_admin_change_on_non_admin: "관리자만 관리자 사용자의 상태를 변경할 수 있습니다." error_status_change_failed: "다음 오류 때문에 사용자 상태 변경 실패함: %{errors}" invite: 이메일을 통해 사용자 초대 invited: 초대됨 @@ -5166,3 +5242,8 @@ ko: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "OpenProject 종료" + warning_message: "OpenProject를 종료하고 외부 웹사이트를 방문하려고 합니다. 외부 웹사이트는 당사의 통제를 받지 않으며 개인정보 보호 및 보안 정책이 다를 수 있다는 점에 유의하시기 바랍니다." + continue_message: "다음 외부 링크로 계속하시겠습니까?" + continue_button: "외부 웹사이트로 계속하기" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 192dde0762e..9236f2757c1 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -109,6 +109,23 @@ lt: explanation: text: "Visi atskiri naudotojo veiksmai (t.y. darbų paketo atnaujinimas du kartus) yra sugrupuojami į vieną veiksmą, jei laiko tarpas tarp jų yra mažesnis už šį nustatymą. Programoje jie bus rodomi kaip vienas veiksmas. Tiek pat bus pavėlinti ir pranešimai. Dėl to sumažės siunčiamų el.laiškų skaičius ir taipogi įtakos %{webhook_link} delsimą." link: "tinklo jungtis" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -590,6 +607,7 @@ lt: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Nėra prieinamų tipų. form: @@ -604,6 +622,9 @@ lt: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -617,6 +638,7 @@ lt: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -724,9 +746,11 @@ lt: create_button: "Sukurti" name_label: "Žetono pavadinimas" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Atpažinimo rakto nepavyko nustatyti iš naujo: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -736,6 +760,9 @@ lt: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "RSS žetonas buvo ištrintas. Norėdami sukurti naują žetoną, prašome naudoti nuorodą RSS sekcijoje." notice_ical_token_revoked: 'iCalendar žetonas „%{token_name}“ projekto „%{project_name}“ kalendoriui „%{calendar_name}“ buvo atšauktas. iCalendar URL su šituo žetonu dabar nebetinkamas.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Nėra jokių naujienų. @@ -1246,6 +1273,10 @@ lt: onthefly: "Automatinis naudotojų kūrimas" port: "Prievadas" tls_certificate_string: "LDAP serverio SSL sertifikatas" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Vaidmenys" notification: @@ -1504,6 +1535,7 @@ lt: even: "turi būti lyginis." exclusion: "yra rezervuotas." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "per didelis (didžiausias leistinas dydis yra %{count} baitų)." filter_does_not_exist: "filtras neegzistuoja." format: "neatitinka laukiamo formato '%{expected}'." @@ -1526,7 +1558,8 @@ lt: not_a_datetime: "nėra tinkama data ir laikas." not_a_number: "nėra skaičius." not_allowed: "netinkamas dėl trūkstamų teisių." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "nėra sveikasis skaičius." not_an_iso_date: "nėra tinkama data. Reikalingas formatas: YYYY-MM-DD." not_same_project: "nepriklauso tam pačiam projektui." @@ -1960,7 +1993,16 @@ lt: few: Prieigos žetonai many: Prieigos žetonai other: Prieigos žetonai - type: "Tipas" + token/rss: + one: "RSS token" + few: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + many: "Types" + other: "Types" user: "Naudotojas" version: "Versija" workflow: "Darbų eiga" @@ -2185,6 +2227,7 @@ lt: button_click_to_reveal: "Spauskite, kad atskleistumėte" button_close: "Uždaryti" button_collapse_all: "Sutraukti visus" + button_confirm: "Confirm" button_configure: "Konfigūruoti" button_continue: "Tęsti" button_complete: "Complete" @@ -2217,6 +2260,7 @@ lt: button_print: "Spausdinti" button_quote: "Cituoti" button_remove: Pašalinti + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Pervardinti" button_replace: "Pakeisti" @@ -2508,7 +2552,7 @@ lt: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2518,10 +2562,12 @@ lt: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2562,8 +2608,8 @@ lt: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2593,6 +2639,8 @@ lt: custom_actions: title: "Pasirinktiniai veiksmai" description: "Savo veiksmai yra vieno paspaudimo kombinacijos, leidžiančios nustatyti veiksmus, kuriuos galite padaryti preinamais kai kuriuose darbo paketuose pagal jų būseną, rolę, tipą ar projektą." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2604,6 +2652,8 @@ lt: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Užtikrinkite, kad į OpenProject įkelti failai būtų patikrinti nuo virusų prieš padarant juos prieinamus kitiems naudotojams." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Statytiniai naudotojai description: > @@ -2903,19 +2953,17 @@ lt: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Pagerinti į Enterprise versiją" postgres_migration: "Migruojame jūsų instaliaciją į PostgreSQL" @@ -2983,14 +3031,17 @@ lt: instructions_after_error: "Bandykite prisijungti dar kartą spustelėdami %{signin}. Jei klaida kartosis, kreipkitės į administratorių." menus: admin: - mail_notification: "El. pašto priminimai" - mails_and_notifications: "Laiškai ir pranešimai" + ai: "Artificial Intelligence (AI)" aggregation: "Agregacija" api_and_webhooks: "API ir tinklo jungtys" + mail_notification: "El. pašto priminimai" + mails_and_notifications: "Laiškai ir pranešimai" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Nėra rodytinų prieigos raktų" description: "Visi iš jų buvo išjungti. Jie gali būti vėl įgalinti administravimo meniu." @@ -3000,34 +3051,56 @@ lt: expiration: "Baigiasi" indefinite_expiration: "Niekada" simple_revoke_confirmation: "Ar tikrai norite atšaukti šį raktą?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API žetonai leidžia trečiųjų šalių aplikacijoms komunikuoti su šiuo OpenProject per REST" + static_token_name: "API token" disabled_text: "Administratorius neįjungė API žetonų. Prašome susisiekti su administratoriumi, kad galėtumėte naudoti šią savybę." - add_button: "API Token" - api: - static_token_name: "API žetonas" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "Administratorius neįjungė iCalendar prenumeratų. Prašome susisiekti su administratoriumi, kad galėtumėte naudoti šią savybę." - empty_text_hint: "Norėdami pridėti iCalendar žetoną, prenumeruokite naują ar esamą kalendorių iš projekto kalendoriaus modulio. Jūs turite turėti reikiamas teises." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth žetonai leidžia trečiųjų šalių aplikacijoms prisijungti prie šio OpenProject." - empty_text_hint: "Nėra sukonfigūruotos ir jums aktyvios prieigos trečiųjų šalių aplikacijai. Prašome susisiekti su administratoriumi, kad būtų aktyvuota ši savybė." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "RSS žetonai leidžia naudotojams gauti informaciją apie paskutinius šio OpenProject egzemplioriaus pasikeitimus per išorinę RSS skaityklę." - static_token_name: "RSS žetonas" - disabled_text: "Administratorius neįjungė RSS žetonų. Prašome susisiekti su administratoriumi, kad galėtumėte naudoti šią savybę." + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Failų saugyklos" - text_hint: "Failų saugyklų žetonai jungia šį OpenProject egzempliorių su išorine failų saugykla." - empty_text_hint: "Su jūsų paskyra nėra susietos saugyklos prieigos." - revoke_token: "Ar tikrai norite išimti šį žetoną? Jums vėl reikės prisijungti prie %{storage}" - removed: "Failų saugykla sėkmingai pašalinta" - failed: "Įvyko klaida ir žetono išimti nepavyko. Prašome pabandyti dar kartą vėliau." unknown_storage: "Nežinoma saugykla" notifications: reasons: @@ -3089,6 +3162,7 @@ lt: label_always_visible: "Visada rodomas" label_announcement: "Skelbimas" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API prieigos raktas" label_api_access_key_created_on: "API prieigos raktas sukurtas prieš %{value}" label_api_access_key_type: "API" @@ -3344,6 +3418,7 @@ lt: label_journal_diff: "Aprašymų palyginimas" label_language: "Kalba" label_languages: "Kalbos" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Peršokti į projektą..." label_keyword_plural: "Raktažodžiai" @@ -3521,9 +3596,6 @@ lt: label_project_hierarchy: "Projekto hierarchija" label_project_mappings: "Projektai" label_project_new: "Naujas projektas" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projektai" label_project_list_plural: "Projektų sąrašai" label_project_life_cycle: "Project life cycle" @@ -3989,7 +4061,7 @@ lt: notice_not_authorized: "Jūs neturite prieigos teisių prie šio puslapio." notice_not_authorized_archived_project: "Projektas, kurį bandote atidaryti, buvo suarchyvuotas." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Jūsų slaptažodis yra neteisingas. Negalima tęsti." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Rasta %{number} rezultatai (-as, -ų).\nPaspauskite 'Tab', kad susikoncentruotumėte į pirmą rezultatą." notice_principals_found_single: "Yra vienas rezultatas.\nPaspauskite 'Tab', kad susikoncentruotumėte į jį." notice_parent_item_not_found: "Parent item not found." @@ -4341,6 +4413,9 @@ lt: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4353,11 +4428,17 @@ lt: setting_apiv3_cors_origins_text_html: > Jei CORS yra įgalinta, tai yra kilmės domenai, kuriems leidžiama pasiekti OpenProject API.
    Kaip nurodyti reikšmes aprašoma Origin antraštės dokumentacijoje. setting_apiv3_write_readonly_attributes: "Rašymo prieiga prie tik skaitymui skirtų atributų" - setting_apiv3_write_readonly_attributes_instructions_html: > - Įjungus API leis administratoriams kūrimo metu rašyti statinius tik skaitymui skirtus atributus, tokius kaip createdAt ir author.
    Įspėjimas: Šis nustatymas naudojamas pavyzdžiui importuojant duomenis, bet leidžia administratoriams apsimesti, kad elementus sukuria kiti naudotojai. Visos kūrimo užklausos žurnalizuojamos su tikru autoriumi.
    Daugiau informacijos apie atributus ir palaikomus resursus rasite %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maksimalus API puslapio dydis" - setting_apiv3_max_page_instructions_html: > - Nustatykite maksimalų API atsakymo puslapio dydį. Bus neįmanoma vykdyti API užklausas, kurios grąžina daugiau reikšmių viename puslapyje.
    Įspėjimas Prašome keisti šią reikšmę jei jums to tikrai reikia. Nustatyta didelė reikšmė stipriai įtakos greitaveiką, o maža reikšmė mažesnė už puslapiavimo parinktis reikš klaida puslapiuojamuose vaizduose. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentacija" setting_apiv3_docs_enabled: "Įjungti dokumentų puslapį" setting_apiv3_docs_enabled_instructions_html: > @@ -4542,7 +4623,7 @@ lt: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Sudarykite sąrašą leidžiamų failų praplėtimų ir/arba MIME tipų su kuriais bus leidžiama įkelti failus.
    Įveskite failų praplėtimus (t.y., %{ext_example}) arba MIME tipus (t.y., %{mime_example}).
    Palikite tuščią, jei norite leisti visus tipus. Leidžiama daugiau nei viena reikšmė (po vieną kiekvienoje eilutėje). @@ -4648,7 +4729,7 @@ lt: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4816,6 +4897,7 @@ lt: Pastaba: įjungus bus rodomas ženkliukas su jūsų diegimo būsena %{information_panel_label} administravimo skydelyje. Rodoma tik administratoriams.
    Ženkliukas palygins jūsų OpenProject versiją su oficialia OpenProject laidų duomenų baze ir praneš, jei yra atnaujinimų dėl žinomų saugumo problemų. Daugiau informacijos, ką daro šis tikrinimas, kokią reikia pateikti informaciją ir kaip šį tikrinimą išjungti, rasite konfigūravimo dokumentacijoje. text_own_membership_delete_confirmation: "Jūs ketinate pašalinti keletą ar visus leidimus ir gali būti, kad nebegalėsite redaguoti šio projekto po to.\nAr jūs tikrai norite tęsti?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Į papildinių katalogą galima rašyti" text_powered_by: "Parengta pagal %{link}" text_project_identifier_info: "Leidžiamos tik mažosios raidės (a-z), skaitmenys, paprasti (-) ir žemi brūkšneliai (_). Taip pat privalo prasidėti mažąja raide." @@ -5315,3 +5397,8 @@ lt: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index abd3c45827f..860bbafffe8 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -109,6 +109,23 @@ lv: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -592,6 +609,7 @@ lv: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Pašlaik nav pieejams neviens veids. form: @@ -606,6 +624,9 @@ lv: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,6 +640,7 @@ lv: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -720,9 +742,11 @@ lv: create_button: "Izveidot" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -732,6 +756,9 @@ lv: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Pašlaik nav nevienu ziņu. @@ -1240,6 +1267,10 @@ lv: onthefly: "Automatic user creation" port: "Ports" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Lomas" notification: @@ -1498,6 +1529,7 @@ lv: even: "jābūt vienlīdzīgiem." exclusion: "rezervēts." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "ir pārāk liels (maksimālais lielums ir %{count} baiti)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1520,7 +1552,8 @@ lv: not_a_datetime: "is not a valid date time." not_a_number: "nav skaitlis." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "nav vesels skaitlis." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "neietilpst vienā un tai pašā projektā." @@ -1941,7 +1974,14 @@ lv: zero: Access tokens one: Piekļuves pilnvara other: Access tokens - type: "Veids" + token/rss: + zero: "RSS tokens" + one: "RSS token" + other: "RSS tokens" + type: + zero: "Types" + one: "Type" + other: "Types" user: "Lietotāji" version: "Versija" workflow: "Darbplūsma" @@ -2162,6 +2202,7 @@ lv: button_click_to_reveal: "Click to reveal" button_close: "Aizvērt" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2194,6 +2235,7 @@ lv: button_print: "Drukāt" button_quote: "Citēt" button_remove: Noņemt + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2465,7 +2507,7 @@ lv: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2475,10 +2517,12 @@ lv: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2519,8 +2563,8 @@ lv: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2550,6 +2594,8 @@ lv: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2561,6 +2607,8 @@ lv: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2859,19 +2907,17 @@ lv: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2939,14 +2985,17 @@ lv: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "E-pasta paziņojumi" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "E-pasta paziņojumi" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2956,34 +3005,56 @@ lv: expiration: "Termiņš izbeidzas" indefinite_expiration: "Nekad" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3045,6 +3116,7 @@ lv: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API piekļuves atslēga" label_api_access_key_created_on: "API piekļuves atslēga izveidota pirms %{value} " label_api_access_key_type: "API" @@ -3300,6 +3372,7 @@ lv: label_journal_diff: "Description Comparison" label_language: "Valoda" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3477,9 +3550,6 @@ lv: label_project_hierarchy: "Projektu hierarhija" label_project_mappings: "Projekti" label_project_new: "Jauns projekts" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekti" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3944,7 +4014,7 @@ lv: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4298,6 +4368,9 @@ lv: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4310,11 +4383,17 @@ lv: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentācija" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4499,7 +4578,7 @@ lv: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4605,7 +4684,7 @@ lv: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4773,6 +4852,7 @@ lv: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Darbojas uz %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5271,3 +5351,8 @@ lv: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 57c23429880..298ec1cb4d8 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -109,6 +109,23 @@ mn: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ mn: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ mn: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ mn: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ mn: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ mn: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ mn: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ mn: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ mn: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ mn: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Хувилбар" workflow: "Workflow" @@ -2136,6 +2174,7 @@ mn: button_click_to_reveal: "Click to reveal" button_close: "Хаах" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ mn: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ mn: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ mn: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ mn: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ mn: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ mn: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ mn: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ mn: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ mn: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ mn: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ mn: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ mn: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Төслийн жагсаалтууд" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ mn: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ mn: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ mn: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ mn: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ mn: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ mn: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ mn: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 605e2ca2fd4..e86291f6fb2 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -109,6 +109,23 @@ ms: explanation: text: "Tindakan individu pengguna (cth. mengemas kini pakej kerja dua kali) dikumpulkan ke dalam satu tindakan tunggal jika perbezaan umur mereka kurang daripada tempoh masa yang ditetapkan. Mereka akan dipaparkan sebagai tindakan tunggal dalam aplikasi. Ini juga akan menangguhkan pemberitahuan dengan jumlah masa yang sama, mengurangkan bilangan e-mel yang dihantar serta akan memberi kesan kepada penagguhan %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -589,6 +606,7 @@ ms: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Tiada jenis yang tersedia buat masa ini. form: @@ -603,6 +621,9 @@ ms: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -616,6 +637,7 @@ ms: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -705,9 +727,11 @@ ms: create_button: "Cipta" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Gagal untuk set semula token akses: %{error}" failed_to_create_token: "Gagal membuat token akses: %{error}" failed_to_revoke_token: "Gagal menarik balik token akses: %{error}" @@ -717,6 +741,9 @@ ms: notice_api_token_revoked: "Token API telah dipadam. Sila gunakan butang di bahagian API untuk mencipta token baharu." notice_rss_token_revoked: "Token RSS telah dipadamkan. Untuk mencipta token baharu sila gunakan pautan di bahagian RSS." notice_ical_token_revoked: 'Token iCalendar "%{token_name}" untuk kalendar "%{calendar_name}" projek "%{project_name}" telah dibatalkan. URL iCalendar serta token ini sudah tidak sah.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Tiada berita untuk dipaparkan buat masa ini. @@ -1220,6 +1247,10 @@ ms: onthefly: "Penciptaan pengguna automatik" port: "Port" tls_certificate_string: "Sijil SSL server LDAP" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Peranan\n" notification: @@ -1478,6 +1509,7 @@ ms: even: "perlu sama." exclusion: "sudah dikhaskan." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "adalah terlalu besar (saiz maksimum adalah %{count} Bytes)." filter_does_not_exist: "penyaring tidak wujud." format: "tidak sepadan dengan format yang dijangka '%{expected}'." @@ -1500,7 +1532,8 @@ ms: not_a_datetime: "bukan tarikh masa yang sah." not_a_number: "bukan nombor." not_allowed: "adalah tidak sah kerana kekurangan kebenaran." - not_json: "bukan objek JSON yang sah." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "bukan sebuah integer." not_an_iso_date: "bukan tarikh yang sah. Format yang diperlukan: TTTT-BB-HH." not_same_project: "tidak tergolong dalam projek yang sama." @@ -1895,7 +1928,10 @@ ms: status: "Status pakej kerja" token/api: other: Token akses - type: "Jenis" + token/rss: + other: "RSS tokens" + type: + other: "Types" user: "Pengguna" version: "Versi" workflow: "Aliran kerja" @@ -2108,6 +2144,7 @@ ms: button_click_to_reveal: "Klik untuk dedahkan" button_close: "Tutup" button_collapse_all: "Sembunyikan semua" + button_confirm: "Confirm" button_configure: "Konfigurasi" button_continue: "Teruskan" button_complete: "Complete" @@ -2140,6 +2177,7 @@ ms: button_print: "Cetak" button_quote: "Petikan" button_remove: Keluarkan + button_remove_permanently: "Remove permanently" button_remove_reminder: "Buang peringatan" button_rename: "Namakan semula" button_replace: "Gantikan" @@ -2371,7 +2409,7 @@ ms: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2381,10 +2419,12 @@ ms: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2425,8 +2465,8 @@ ms: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2456,6 +2496,8 @@ ms: custom_actions: title: "Tindakan tersuai" description: "Tindakan tersuai adalah pintasan satu klik ke satu set tindakan yang telah ditetapkan yang anda boleh sediakan untuk pakej kerja tertentu berdasarkan status, peranan, jenis atau projek." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2467,6 +2509,8 @@ ms: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Pastikan fail yang dimuat naik dalam OpenProject diimbas untuk virus sebelum boleh diakses oleh pengguna lain." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Pengguna placeholder description: > @@ -2763,19 +2807,17 @@ ms: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Naik taraf ke edisi Enterprise" postgres_migration: "Mengalihkan pemasangan anda ke PostgreSQL" @@ -2843,14 +2885,17 @@ ms: instructions_after_error: "Anda boleh cuba daftar masuk semula dengan mengklik %{signin}. Jika ralat ini masih berterusan, sila minta bantuan dari pentadbir anda," menus: admin: - mail_notification: "Pemberitahuan e-mel" - mails_and_notifications: "E-mel dan pemberitahuan" + ai: "Artificial Intelligence (AI)" aggregation: "Pengumpulan" api_and_webhooks: "API dan webhooks" + mail_notification: "Pemberitahuan e-mel" + mails_and_notifications: "E-mel dan pemberitahuan" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Tiada token akses untuk dipaparkan" description: "Semuanya telah dinyahdayakan. Mereka boleh didayakan semula dalam menu pentadbiran." @@ -2860,34 +2905,56 @@ ms: expiration: "Tamat tempoh" indefinite_expiration: "Tidak akan" simple_revoke_confirmation: "Adakah anda pasti anda mahu membatalkan token ini?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "Token API membenarkan aplikasi pihak ketiga untuk berkomunikasi dengan OpenProject ini, contohnya, melalui REST API." + static_token_name: "API token" disabled_text: "Token API tidak didayakan oleh pentadbir. Sila hubungi pentadbir anda untuk menggunakan fitur ini." - add_button: "API Token" - api: - static_token_name: "Token API" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "Langganan iCalendar tidak didayakan oleh pentadbir. Sila hubungi pentadbir anda untuk menggunakan fitur ini." - empty_text_hint: "Untuk menambah token iCalendar, langgan kalendar baharu atau kalendar yang sedia ada dalam modul Kalendar projek. Anda perlu mempunyai kebenaran yang diperlukan." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "Token OAuth membenarkan aplikasi pihak ketiga untuk menyambung dengan contoh OpenProject ini." - empty_text_hint: "Tiada akses aplikasi pihak ketiga yang dikonfigurasikan dan aktif untuk anda. Sila hubungi pentadbir anda untuk aktifkan fitur ini." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "Token RSS membenarkan pengguna untuk mengikut perubahan terkini dalam contoh OpenProject ini melalui pembaca RSS luaran. " - static_token_name: "Token RSS" - disabled_text: "Token RSS tidak diaktifkan oleh pentadbir. Sila hubungi pentadbir anda untuk menggunakan fitur ini." + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Simpanan fail" - text_hint: "Token Storan Fail menyambungkan contoh OpenProject dengan Storan Fail luaran." - empty_text_hint: "Tiada akses storan terpaut pada akaun anda." - revoke_token: "Adakah anda ingin membuang token ini? Anda perlu log masuk semula di %{storage}" - removed: "Token Storan Fail berjaya dipadamkan" - failed: "Sebuah ralat telah berlaku dan token tidak dapat dipadam. Sila cuba lagi kemudian." unknown_storage: "Storan tidak dikenal pasti" notifications: reasons: @@ -2949,6 +3016,7 @@ ms: label_always_visible: "Selalu dipaparkan" label_announcement: "Pengumuman" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Kunci akses API" label_api_access_key_created_on: "Kunci akses API dicipta %{value} yang lalu" label_api_access_key_type: "API" @@ -3204,6 +3272,7 @@ ms: label_journal_diff: "Perbandingan Deskripsi" label_language: "Bahasa" label_languages: "Bahasa-bahasa" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Lompat ke projek..." label_keyword_plural: "Kata kunci" @@ -3381,9 +3450,6 @@ ms: label_project_hierarchy: "Hierarki projek" label_project_mappings: "Projek-projek" label_project_new: "Projek baharu" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projek-projek" label_project_list_plural: "Senarai projek" label_project_life_cycle: "Project life cycle" @@ -3846,7 +3912,7 @@ ms: notice_not_authorized: "Anda tidak diberi kebenaran untuk mengakses halaman ini." notice_not_authorized_archived_project: "Projek yang anda cuba mengakses telah diarkibkan." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Kata laluan tidak betul. Tidak boleh teruskan." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Terdapat %{number} hasil ditemui. \n Tab untuk memfokuskan hasil pertama." notice_principals_found_single: "Terdapat satu hasil. \n Tab untuk fokuskan." notice_parent_item_not_found: "Parent item not found." @@ -4197,6 +4263,9 @@ ms: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4209,11 +4278,17 @@ ms: setting_apiv3_cors_origins_text_html: > 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: > - Jika dibenarkan, API tersebut akan membenarkan para pentadbir untuk menulis atribut statik baca-sahaja semasa penciptaan, seperti diciptakanPada dan pengarang.
    Amaran: Tetapan ini mempunyai kes-guna untuk, cth., mengimport data, tetapi 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_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Saiz halaman maksimum API" - setting_apiv3_max_page_instructions_html: > - Tetapkan saiz halaman maksimum yang boleh diberi maklum balas 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. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentasi" setting_apiv3_docs_enabled: "Benarkan halaman docs" setting_apiv3_docs_enabled_instructions_html: > @@ -4398,7 +4473,7 @@ ms: omniauth_direct_login_hint_html: > Jika pilihan ini aktif, permintaan log masuk akan mengubah hala ke penyedia omniaut yang dikonfigurasikan. Halaman lungsur turun dan log masuk log masuk akan dilumpuhkan.
    Nota: Melainkan anda juga melumpuhkan log masuk kata laluan, dengan pilihan ini didayakan, pengguna masih boleh log masuk secara dalaman dengan melawati halaman log masuk %{internal_path}. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Jelaskan senarai sambungan fail yang sah dan/atau jenis mime bagi fail yang telah dimuat naik.
    Masukkan sambungan fail (cth., %{ext_example}) atau jenis mime (cth., %{mime_example}).
    Tinggalkan kosong untuk benarkan sebarang jenis fail untuk dimuat naik. Pelbagai nilai juga dibenarkan. (satu baris untuk setiap nilai) @@ -4504,7 +4579,7 @@ ms: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4672,6 +4747,7 @@ ms: Perhatian: jika dibenarkan, ini akan paparkan lambang bersertaan status pemasangan di %{information_panel_label} panel pentadbiran, dan di halaman utama. Ia hanya akan dipaparkan ke para pentadbir sahaja.
    Lambang tersebut akan menyemak versi OpenProject terkini anda terhadap pangkalan data keluaran rasmi OpenProject untuk memaklumkan anda tentang sebarang kemas kini atau kelemahan yang diketahui. Untuk maklumat lanjut bagi penyediaan semakan, data apa yang diperlukan untuk menyediakan kemas kini tersedia, dan bagaimana untuk menyahaktifkan semakan ini, sila kunjungi dokumentasi konfigurasi. 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 teruskan?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Aset plugin direktori yang boleh ditulis" text_powered_by: "Dikuasakan oleh %{link}" text_project_identifier_info: "Hanya huruf kecil (a-z), nombor, sengkang dan tanda garis bawah adalah dibenarkan, mesti mula dengan huruf kecil." @@ -5166,3 +5242,8 @@ ms: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 35b93732f87..20b64478728 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -109,6 +109,23 @@ ne: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ ne: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ ne: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ ne: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ ne: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ ne: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ ne: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "भूमिकाहरु" notification: @@ -1489,6 +1520,7 @@ ne: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ ne: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ ne: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ ne: button_click_to_reveal: "हेर्न क्लिक गर्नुहोस" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ ne: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ ne: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ ne: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ ne: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ ne: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ ne: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ ne: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ ne: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ ne: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ ne: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ ne: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "शब्दकुञ्जी" @@ -3430,9 +3501,6 @@ ne: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ ne: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ ne: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ ne: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ ne: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ ne: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ ne: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ ne: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 57cef157b5b..99e6340144e 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -109,6 +109,23 @@ nl: explanation: text: "Individuele acties van een gebruiker (bijv. het bijwerken van een werkpakket twee keer) wordt samengevoegd tot een enkele actie als hun leeftijdverschil minder is dan de aangegeven timespat. Ze worden weergegeven als een enkele actie binnen de applicatie. Dit zal ook meldingen vertragen met dezelfde tijd die het aantal verstuurde e-mails vermindert en zal ook %{webhook_link} vertraging beïnvloeden." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -588,6 +605,7 @@ nl: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Er zijn momenteel geen types beschikbaar. form: @@ -602,6 +620,9 @@ nl: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -615,6 +636,7 @@ nl: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -710,9 +732,11 @@ nl: create_button: "Maken" name_label: "Tokennaam" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Reset-toegangstoken mislukt: %{error}" failed_to_create_token: "Aanmaken van toegang sleutel is mislukt: %{error}" failed_to_revoke_token: "Intrekken van toegang sleutel mislukt: %{error}" @@ -722,6 +746,9 @@ nl: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "Het RSS-sleutel is verwijderd. Gebruik de link in het gedeelte RSS om een nieuwe sleutel aan te maken." notice_ical_token_revoked: 'iCalendar token "%{token_name}" voor kalender "%{calendar_name}" van project "%{project_name}" is ingetrokken. De iCalendar URL met deze token is nu ongeldig.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Er is momenteel geen nieuws om te rapporteren. @@ -1227,6 +1254,10 @@ nl: onthefly: "Automatische gebruiker aanmaken" port: "Poort" tls_certificate_string: "LDAP server SSL-certificaat" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rollen" notification: @@ -1485,6 +1516,7 @@ nl: even: "moet gelijk zijn." exclusion: "is gereserveerd." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is te groot (maximum grootte is %{count} Bytes)." filter_does_not_exist: "filter bestaat niet." format: "komt niet overeen met het verwachte formaat '%{expected}' '." @@ -1507,7 +1539,8 @@ nl: not_a_datetime: "is geen geldige datum tijd." not_a_number: "is geen getal." not_allowed: "is ongeldig vanwege ontbrekende machtigingen." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is niet een geheel getal." not_an_iso_date: "is geen geldige datum. Vereist formaat: JJJJ-MM-DD." not_same_project: "hoort niet bij hetzelfde project." @@ -1915,7 +1948,12 @@ nl: token/api: one: Toegangstoken other: Toegangs-tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Gebruiker" version: "Versie" workflow: "Werkstroom" @@ -2132,6 +2170,7 @@ nl: button_click_to_reveal: "Klik om te onthullen" button_close: "Sluiten" button_collapse_all: "Alles inklappen" + button_confirm: "Confirm" button_configure: "Configureer" button_continue: "Verdergaan" button_complete: "Complete" @@ -2164,6 +2203,7 @@ nl: button_print: "Afdrukken" button_quote: "Citeer" button_remove: Verwijder + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Naam wijzigen" button_replace: "Vervang" @@ -2415,7 +2455,7 @@ nl: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2425,10 +2465,12 @@ nl: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2469,8 +2511,8 @@ nl: description: "Maak automatisch gegenereerde onderwerpen met behulp van kenmerken en tekst waarnaar verwezen wordt." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2500,6 +2542,8 @@ nl: custom_actions: title: "Aangepaste acties" description: "Aangepaste acties zijn met één klik snelkoppelingen naar een aantal vooraf gedefinieerde acties die u op bepaalde werkpakketten op basis van status beschikbaar kunt maken rol, type of project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2511,6 +2555,8 @@ nl: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Tijdelijke gebruikers description: > @@ -2808,19 +2854,17 @@ nl: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade naar Enterprise-editie" postgres_migration: "Uw installatie overzetten naar PostgreSQL" @@ -2888,14 +2932,17 @@ nl: instructions_after_error: "U kan opnieuw proberen inloggen door op %{signin} te klikken. Als de fout aanhoudt, vraag dan uw admin om hulp." menus: admin: - mail_notification: "E-mailnotificaties" - mails_and_notifications: "E-mails en meldingen" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregatie" api_and_webhooks: "API en webhooks" + mail_notification: "E-mailnotificaties" + mails_and_notifications: "E-mails en meldingen" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Geen toegangstokens weer te geven" description: "Alle van hen zijn uitgeschakeld. Zij kunnen opnieuw worden ingeschakeld in het administratie menu." @@ -2905,34 +2952,56 @@ nl: expiration: "Verloopt" indefinite_expiration: "Nooit" simple_revoke_confirmation: "Weet u zeker dat u deze token wilt intrekken?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." + static_token_name: "API token" disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: - static_token_name: "API-sleutel" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Bestandsopslag" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "Er is geen opslagtoegang gekoppeld aan uw account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Onbekende opslag" notifications: reasons: @@ -2994,6 +3063,7 @@ nl: label_always_visible: "Altijd weergegeven" label_announcement: "Mededeling" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API sleutel" label_api_access_key_created_on: "API sleutel %{value} geleden gemaakt" label_api_access_key_type: "API" @@ -3249,6 +3319,7 @@ nl: label_journal_diff: "Beschrijving vergelijking" label_language: "Taal" label_languages: "Talen" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Ga naar een project..." label_keyword_plural: "Trefwoorden" @@ -3426,9 +3497,6 @@ nl: label_project_hierarchy: "Projecthiërarchie" label_project_mappings: "Projecten" label_project_new: "Nieuw project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projecten" label_project_list_plural: "Projectlijsten" label_project_life_cycle: "Project life cycle" @@ -3891,7 +3959,7 @@ nl: notice_not_authorized: "U bent niet gemachtigd om deze pagina te openen." notice_not_authorized_archived_project: "Het project dat u probeert te bezoeken is gearchiveerd." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Uw wachtwoord is niet correct. Kan niet doorgaan." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Er zijn %{number} resultaten gevonden. Tab om het eerste resultaat te tonen." notice_principals_found_single: "Er is één resultaat. Tab om te tonen." notice_parent_item_not_found: "Parent item not found." @@ -4244,6 +4312,9 @@ nl: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4256,11 +4327,17 @@ nl: setting_apiv3_cors_origins_text_html: > Als CORS is ingeschakeld, zijn dit de oorsprong die toegang heeft tot OpenProject API.
    Bekijk de Documentatie op de Oorsprongshoofd over hoe u de verwachte waarden kunt opgeven. setting_apiv3_write_readonly_attributes: "Schrijftoegang tot alleen-lezen attributen" - setting_apiv3_write_readonly_attributes_instructions_html: > - Als deze optie is ingeschakeld, staat de API beheerders toe om statische alleen-lezen attributen te schrijven tijdens het aanmaken, zoals createdAt en author.
    Waarschuwing: Deze instelling heeft een use-case voor bijvoorbeeld het importeren van gegevens, maar staat beheerders toe om zich bij het aanmaken van items voor te doen als andere gebruikers. Alle aanmaakverzoeken worden echter gelogd met de echte auteur.
    Voor meer informatie over attributen en ondersteunde bronnen, zie de %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximale API pagina grootte" - setting_apiv3_max_page_instructions_html: > - Stel de maximale pagina grootte in waarmee de API zal reageren. Het is niet mogelijk om API-verzoeken uit te voeren die meer waarden op een enkele pagina weergeven.
    Waarschuwing: Wijzig deze waarde alleen als u zeker weet waarom u het nodig heeft. Het instellen op een hoge waarde zal aanzienlijke prestatieeffecten hebben, terwijl een waarde lager is dan de per pagina opties fouten veroorzaakt in gepagineerde weergaven. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentatie" setting_apiv3_docs_enabled: "Documentenpagina inschakelen" setting_apiv3_docs_enabled_instructions_html: > @@ -4445,7 +4522,7 @@ nl: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Definieer een lijst met geldige bestandsextensies en/of MIME-types voor geüploade bestanden.
    Vul de bestandsextensies in (bijv. %{ext_example}) of MIME-types (bijv. ., %{mime_example}).
    Laat leeg om elk bestandstype te kunnen uploaden. Meerdere waarden toegestaan (één regel voor elke waarde). @@ -4551,7 +4628,7 @@ nl: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4719,6 +4796,7 @@ nl: Opmerking: indien ingeschakeld zal dit een badge weergeven met uw installatiestatus in de %{information_panel_label} administratie paneel, en op de homepage. Deze wordt alleen getoond aan beheerders.
    De badge zal uw huidige OpenProject versie controleren tegen de officiële OpenProject-database om u te waarschuwen voor updates of bekende kwetsbaarheden. Voor meer informatie over wat de controle biedt, welke gegevens nodig zijn om beschikbare updates te verstrekken en hoe deze controle kan worden uitgeschakeld, bezoek de configuratiedocumentatie. text_own_membership_delete_confirmation: "U staat op het punt om enkele of alle van uw machtigingen te verwijderen en kan dit project daarna mogelijk niet meer bewerken.\nWeet u zeker dat u wilt doorgaan?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin directory schrijfbaar" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Alleen kleine letters (a-z), cijfers, streepjes en underscores (_) zijn toegestaan, moet beginnen met een kleine letter." @@ -5214,3 +5292,8 @@ nl: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index d6f60cdc605..36286ed662a 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -109,6 +109,23 @@ explanation: text: "Individuelle handlinger av en bruker (f.eks. oppdatering av en arbeidspakke to ganger) aggregeres til en enkelt handling hvis aldersforskjellen er mindre enn det spesifiserte tidsrommet. De vil bli vist som en enkelt handling i programmet. Dette vil også forsinke varslinger med samme tidsperiode som reduserer antall e-poster som sendes, og vil også påvirke %{webhook_link} forsinkelse." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Det finnes ingen tilgjengelige typer. form: @@ -605,6 +623,9 @@ work_package_priorities: new_label: "Ny prioritet" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ create_button: "Opprett" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Tilgangstoken kunne ikke tilbakestilles: %{error}" failed_to_create_token: "Tilgangsnøkkelen kunne ikke opprettes: %{error}" failed_to_revoke_token: "Kunne ikke oppheve tilgangstoken: %{error}" @@ -725,6 +749,9 @@ notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "RSS-koden er slettet. For å opprette et nytt token må du bruke linken i RSS-avsnittet." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for kalender "%{calendar_name}" i prosjekt "%{project_name}" er trukket tilbake. iCalendar-URL''en med dette tokenet er nå ugyldig.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Det er ingen nyheter å vise. @@ -1230,6 +1257,10 @@ onthefly: "Automatisk brukeropprettelse" port: "Port" tls_certificate_string: "LDAP-tjener SSL sertifikat" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Rolle" notification: @@ -1488,6 +1519,7 @@ even: "må være partall" exclusion: "er reservert." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "er for stor (maks størrelse er %{count} Bytes)." filter_does_not_exist: "filter finnes ikke." format: "samsvarer ikke med det forventede formatet '%{expected}'." @@ -1510,7 +1542,8 @@ not_a_datetime: "er ikke et gyldig tidspunkt for datoen." not_a_number: "er ikke et tall." not_allowed: "er ugyldig på grunn av manglende tillatelser." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "er ikke et heltall." not_an_iso_date: "er ikke en gyldig dato. Påkrevd format: ÅÅÅÅ-MM-DD." not_same_project: "hører ikke til samme prosjekt." @@ -1918,7 +1951,12 @@ token/api: one: Access token other: Tilgangsnøkler - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Bruker" version: "Versjon" workflow: "Arbeidsflyt" @@ -2135,6 +2173,7 @@ button_click_to_reveal: "Klikk for å vise" button_close: "Lukk" button_collapse_all: "Skjul alle" + button_confirm: "Confirm" button_configure: "Konfigurer" button_continue: "Fortsette" button_complete: "Complete" @@ -2167,6 +2206,7 @@ button_print: "Skriv ut" button_quote: "Sitèr" button_remove: Fjern + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Endre navn" button_replace: "Erstatt" @@ -2418,7 +2458,7 @@ baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2428,10 +2468,12 @@ edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2472,8 +2514,8 @@ description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2503,6 +2545,8 @@ custom_actions: title: "Tilpassede handlinger" description: "Egendefinerte handlinger er snarveier med ett klikk til en rekke forhåndsdefinerte handlinger som du kan gjøre tilgjengelige på visse arbeidspakker basert på status, rolle, type eller prosjekt." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2514,6 +2558,8 @@ description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Sikre at opplastede filer i OpenProject blir skannet for virus før de er tilgjengelige for andre brukere." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Plassholder brukere description: > @@ -2811,19 +2857,17 @@ learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Oppgrader til Enterprise utgaven" postgres_migration: "Overføre installasjonen til PostgreSQL" @@ -2891,14 +2935,17 @@ instructions_after_error: "Du kan forsøke å logge inn på nytt ved å trykke %{signin}. Dersom feilen vedvarer må du kontakte din systemadministrator for hjelp." menus: admin: - mail_notification: "E-postvarsler" - mails_and_notifications: "E-post og varsler" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregering" api_and_webhooks: "API og webhooks" + mail_notification: "E-postvarsler" + mails_and_notifications: "E-post og varsler" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Ingen tilgangsnøkler å vise" description: "Alle disse er deaktivert. De kan reaktiveres i administrasjonsmenyen." @@ -2908,34 +2955,56 @@ expiration: "Utløper" indefinite_expiration: "Aldri" simple_revoke_confirmation: "Er du sikker på at du vil oppheve denne nøkkelen?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API-tokens tillater tredjepartsapplikasjoner å kommunisere med denne OpenProject instansen via REST APIs." + static_token_name: "API token" disabled_text: "API-nøkler er ikke aktivert av administratoren. Kontakt systemansvarlig for å bruke denne funksjonen." - add_button: "API Token" - api: - static_token_name: "API-nøkkel" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar-abonnement er ikke aktivert av administratoren. Vennligst kontakt systemansvarlig for å bruke denne funksjonen." - empty_text_hint: "For å legge til et iCalendar-nøkkel, abonnér på en ny eller eksisterende kalender fra kalender-modulen til et prosjekt. Du må ha de nødvendige tillatelsene." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth nøkler tillater tredjepartssøknader å koble til denne OpenProject instansen." - empty_text_hint: "Det er ingen tredjeparts-tilgang konfigurert og aktiv for deg. Kontakt systemansvarlig for å aktivere denne funksjonen." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "RSS-nøkler tillater brukere å holde de siste endringene i denne OpenProject forekomsten via en ekstern RSS-leser." - static_token_name: "RSS nøkkel" - disabled_text: "RSS-nøkler er ikke aktivert av administrator. Kontakt systemansvarlig for å bruke denne funksjonen." + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Fillagringer" - text_hint: "Fillagrings-nøkler kobler til dette OpenProjectets instansen med et eksternt fillager." - empty_text_hint: "Det er ingen lagringstilgang knyttet til kontoen din." - revoke_token: "Vil du virkelig fjerne denne nøkkelen? Du må logge inn igjen på %{storage}" - removed: "Lagringsnøkkelen for fillagring ble fjernet" - failed: "En feil oppstod, nøkkelen kunne ikke fjernes. Prøv igjen senere." unknown_storage: "Ukjent lagring" notifications: reasons: @@ -2997,6 +3066,7 @@ label_always_visible: "Vises alltid" label_announcement: "Kunngjøring" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API adgangsnøkkel" label_api_access_key_created_on: "API adgangsnøkkel ble opprettet for %{value} siden" label_api_access_key_type: "API" @@ -3252,6 +3322,7 @@ label_journal_diff: "Sammenligning av beskrivelse" label_language: "Språk" label_languages: "Språk" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Gå til et prosjekt..." label_keyword_plural: "Nøkkelord" @@ -3429,9 +3500,6 @@ label_project_hierarchy: "Prosjekthierarki" label_project_mappings: "Prosjekter" label_project_new: "Nytt prosjekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Prosjekter" label_project_list_plural: "Prosjektlister" label_project_life_cycle: "Project life cycle" @@ -3895,7 +3963,7 @@ notice_not_authorized: "Du har ikke tilgang til å åpne denne siden." notice_not_authorized_archived_project: "Prosjektet du forsøker å åpne er arkivert." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Passordet er ikke riktig. Kan ikke fortsette." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Det finnes %{number} resultater. \n bruk tab for å fokusere det første resultatet." notice_principals_found_single: "Det er ett resultat. \n Bruk tab for å fokusere det." notice_parent_item_not_found: "Parent item not found." @@ -4248,6 +4316,9 @@ setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4260,11 +4331,17 @@ setting_apiv3_cors_origins_text_html: > Hvis CORS er aktivert, er dette opprinnelsen som har tilgang til OpenProject API.
    Kontroller Dokumentasjonen på Origin header på hvordan angi de forventede verdiene. setting_apiv3_write_readonly_attributes: "Skrivetilgang til skrivebeskyttede egenskaper" - setting_apiv3_write_readonly_attributes_instructions_html: > - Hvis aktivert, vil API-et tillate at administratorer skriver statiske skrivebeskyttede egenskaper under oppretting, som OpprettetPå og forfatter.
    Advarsel: Denne innstillingen har et brukstilfelle for f.eks importere data, men lar administratorer personliggjøre etableringen av elementer som andre brukere. Alle forespørsler om opprettelse blir imidlertid logget med virkelig forfatter.
    For mer informasjon om egenskaper og støttede ressurser, se %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maksimal størrelse på API side" - setting_apiv3_max_page_instructions_html: > - Angi den maksimale sidestørrelsen API vil svare med. (Automatic Translation) Det vil ikke være mulig å utføre API-forespørsler som returnerer flere verdier på én side.
    Advarsel: Endre denne verdien hvis du er sikker på hvorfor du trenger den. Ved å sette en høy verdi vil det ha betydelig innvirkning på ytelsen, mens en verdi lavere enn per sidealternativer vil forårsake feil i sidevisning + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentasjon" setting_apiv3_docs_enabled: "Aktiver dokumenter" setting_apiv3_docs_enabled_instructions_html: > @@ -4449,7 +4526,7 @@ omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Definer en liste over gydlige fil-typer og/eller mime typer for opplastingsfiler.
    Sett inn fil-typer (f.eks. %{ext_example}) eller mime typer (f.eks. %{mime_example}).
    La stå tom for å godta at alle filtyper kan lastes opp. Flere verdier er tillatt (en linje for hver verdi). @@ -4555,7 +4632,7 @@ project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4723,6 +4800,7 @@ Merk: Hvis aktivert, vil dette vise et merke med din installasjonsstatus i %{information_panel_label} administrasjonspanel, og på hjemmesiden. Det er kun vist til administratorer.
    Merket sjekker din nåværende OpenProject versjon mot den offisielle OpenProject utgivelsesdatabasen for å varsle deg om oppdateringer og kjente sårbarheter. For mer informasjon om hva som finnes av kontrollen, hvilke data som er nødvendig for å framskaffe tilgjengelige oppdateringer, og hvordan denne sjekken kan deaktiveres, besøk konfigurasjonsdokumentasjonen. text_own_membership_delete_confirmation: "Du er i ferd med å fjerne noen eller alle dine egne rettigheter og du vil kanskje ikke kunne redigere dette prosjektet etterpå.\nEr du sikker på at du vil fortsette?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Mappen for programtillegg er skrivbar" text_powered_by: "Driftes med %{link}" text_project_identifier_info: "Kun små bokstaver (a-z), tall, bindestrek og understrek er tillatt. Første tegn må være liten bokstav." @@ -5219,3 +5297,8 @@ token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index bc9969eec0a..bcc1628ff4a 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -109,6 +109,23 @@ pl: explanation: text: "Indywidualne działania użytkownika (np. dwukrotna aktualizacja pakietu roboczego) są agregowane w jedno działanie, jeśli różnica czasowa między nimi jest mniejsza niż określony przedział czasowy. Będą one wyświetlane jako jedno działanie w aplikacji. Spowoduje to również opóźnienie powiadomień o tę samą ilość czasu, zmniejszając liczbę wysyłanych wiadomości e-mail i wpłynie też na opóźnienie %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "Protokół kontekstu modelu umożliwia agentom AI dostarczanie użytkownikom narzędzi i zasobów udostępnianych przez to wystąpienie OpenProject." + resources_heading: "Zasoby" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Zaktualizuj zasoby" + tools_heading: "Narzędzia" + tools_description: "OpenProject implementuje następujące narzędzia. Każde z nich może zostać włączone, przemianowane i opisane zgodnie z Twoim życzeniem. Aby uzyskać więcej informacji, zapoznaj się z [dokumentacją narzędzi MCP](docs_url)." + tools_submit: "Zaktualizuj narzędzia" + multi_update: + success: "Konfiguracje MCP zostały zaktualizowane." + server_form: + description_caption: "Sposób, w jaki serwer MCP będzie opisywany innym aplikacjom, które się z nim łączą." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "Nie można zaktualizować konfiguracji MCP." + success: "Konfiguracja MCP została zaktualizowana." scim_clients: authentication_methods: sso: "JWT od dostawcy tożsamości" @@ -590,6 +607,7 @@ pl: is_for_all_blank_slate: heading: Dla wszystkich projektów description: Ten atrybut projektu jest włączony we wszystkich projektach, ponieważ jest zaznaczona opcja „Dla wszystkich projektów”. Nie można go wyłączyć dla poszczególnych projektów. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Nie ma dostępnych typów. form: @@ -604,6 +622,9 @@ pl: work_package_priorities: new_label: "Nowy priorytet" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "Wygenerowany artefakt zostanie zapisany jako załącznik PDF do pakietu roboczego artefaktu." description_file_link_export: "Pakiet roboczy artefaktu będzie zawierał link do pliku PDF przechowywanego w zewnętrznym magazynie plików. Wymaga działającego magazynu plików z automatycznie zarządzanymi folderami tego projektu. Obecnie obsługiwane są tylko magazyny plików Nextcloud." @@ -617,6 +638,7 @@ pl: label_request_submission: "Przesłanie żądania" project_attributes_description: > Wybierz atrybuty projektu, które powinny zostać uwzględnione w żądaniu zainicjowania projektu. Ta lista zawiera tylko [atrybuty projektu](project_attributes_url) włączone dla tego projektu. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edytuj status wizard: @@ -724,9 +746,11 @@ pl: create_button: "Utwórz" name_label: "Nazwa tokena" created_dialog: + one_time_warning: "Jest to jedyny raz, gdy zobaczysz ten token. Koniecznie skopiuj go teraz." token/api: title: "Token interfejsu API został wygenerowany" - warning: "Jest to jedyny raz, gdy zobaczysz ten token. Koniecznie skopiuj go teraz." + token/rss: + title: "Token RSS został wygenerowany" failed_to_reset_token: "Nie można zresetować tokena dostępu: %{error}" failed_to_create_token: "Nie można utworzyć tokena dostępu: %{error}" failed_to_revoke_token: "Nie można unieważnić tokena dostępu: %{error}" @@ -736,6 +760,9 @@ pl: notice_api_token_revoked: "Token API został usunięty. Aby utworzyć nowy token, użyj przycisku w sekcji API." notice_rss_token_revoked: "Token RSS został usunięty. Aby utworzyć nowy token użyj linku w sekcji RSS." notice_ical_token_revoked: 'Token iCalendar „%{token_name}” kalendarza „%{calendar_name}” projektu „%{project_name}” został unieważniony. Adres URL iCalendar z tym tokenem jest teraz nieprawidłowy.' + password_confirmation_dialog: + confirmation_required: "Aby potwierdzić tę zmianę, należy wprowadzić hasło do konta." + title: "Aby kontynuować, potwierdź hasło" news: index: no_results_title_text: Nie ma jeszcze żadnych wiadomości do wyświetlenia. @@ -1245,6 +1272,10 @@ pl: onthefly: "Automatyczne tworzenie użytkowników" port: "Port" tls_certificate_string: "Certyfikat SSL serwera LDAP" + mcp_configuration: + enabled: Włączona + title: Tytuł + description: Opis member: roles: "Role" notification: @@ -1503,6 +1534,7 @@ pl: even: "musi być takie samo." exclusion: "jest już zajęte." feature_disabled: jest niedostępny. + feature_disabled_for_project: jest wyłączona dla tego projektu. file_too_large: "jest za długie (maksymalna wielkość to %{count} Bajtów)." filter_does_not_exist: "filtr nie istnieje." format: "nie pasuje do oczekiwanego formatu '%{expected}'." @@ -1525,7 +1557,8 @@ pl: not_a_datetime: "nie jest poprawną datą i czasem." not_a_number: "nie jest liczbą." not_allowed: "jest nieprawidłowy ze względu na brak uprawnień." - not_json: "nie jest prawidłowym obiektem JSON." + not_json: "nie może być analizowany jako kod JSON." + not_json_object: "nie jest obiektem JSON." not_an_integer: "nie jest liczbą całkowitą." not_an_iso_date: "wprowadzono nieprawidłową datę. Wymagany format: RRRR-MM-DD." not_same_project: "nie należy do tego samego projektu." @@ -1959,7 +1992,16 @@ pl: few: Tokeny dostępu many: Tokenów dostępu other: Tokenu dostępu - type: "Typ" + token/rss: + one: "Token RSS" + few: "Tokeny RSS" + many: "Tokeny RSS" + other: "Tokeny RSS" + type: + one: "Typ" + few: "Typy" + many: "Typy" + other: "Typy" user: "Użytkownik" version: "Wersja" workflow: "Przepływ pracy" @@ -2184,6 +2226,7 @@ pl: button_click_to_reveal: "Kliknij aby pokazać" button_close: "Zamknij" button_collapse_all: "Zwiń wszystko" + button_confirm: "Potwierdź" button_configure: "Konfigurowanie" button_continue: "Dalej" button_complete: "Ukończ" @@ -2216,6 +2259,7 @@ pl: button_print: "Drukuj" button_quote: "Cytat" button_remove: Usuń + button_remove_permanently: "Usuń bezpowrotnie" button_remove_reminder: "Usuń przypomnienie" button_rename: "Zmień nazwę" button_replace: "Zastąp" @@ -2507,7 +2551,7 @@ pl: baseline_comparison: Porównania linii odniesienia board_view: Tablice zaawansowane calculated_values: Obliczane wartości - conditional_highlighting: Wyróżnianie warunkowe + capture_external_links: Przechwyć linki zewnętrzne internal_comments: Komentarze wewnętrzne custom_actions: Działania niestandardowe custom_field_hierarchies: Hierarchie @@ -2517,10 +2561,12 @@ pl: edit_attribute_groups: Edytuj grupy atrybutów gantt_pdf_export: Eksport wykresu Gantta w formacie PDF ldap_groups: Synchronizacja użytkowników i grup LDAP + mcp_server: Serwer MCP nextcloud_sso: Logowanie jednokrotne do magazynu Nextcloud one_drive_sharepoint_file_storage: Magazyn plików OneDrive/SharePoint placeholder_users: Użytkownicy zastępczy portfolio_management: Zarządzanie portfoliami + project_creation_wizard: Żądanie zainicjowania projektu project_list_sharing: Udostępnianie listy projektów readonly_work_packages: Pakiety robocze tylko do odczytu scim_api: Interfejs API serwera SCIM @@ -2561,8 +2607,8 @@ pl: description: "Utwórz automatycznie generowane tematy za pomocą wywoływanych atrybutów i tekstu." customize_life_cycle: description: "Twórz i organizuj fazy projektu inne niż zapewniane przez planowanie cyklu projektu PM2." - conditional_highlighting: - description: "Chcesz, aby niektóre pakiety robocze wyróżniały się na tle innych? Użyj wyróżnienia warunkowego w tabeli pakietów roboczych." + capture_external_links: + description: "Zapobiegaj atakom socjotechnicznym, przechwytując linki zewnętrzne i ostrzegając o nich, zanim użytkownicy je odwiedzą." work_package_query_relation_columns: description: "Chcesz zobaczyć relacje lub elementy podrzędne na liście pakietów roboczych?" edit_attribute_groups: @@ -2592,6 +2638,8 @@ pl: custom_actions: title: "Działania niestandardowe" description: "Akcje niestandardowe są skrótami do zestawu predefiniowanych akcji, które można udostępnić w określonych pakietach roboczych na podstawie statusu, roli, typu lub projektu." + mcp_server: + description: "Zintegruj agentów AI ze swoim wystąpieniem OpenProject za pomocą usługi MCP." nextcloud_sso: title: "Logowanie jednokrotne do magazynu Nextcloud" description: "Włącz bezproblemowe, bezpieczne uwierzytelnianie dla swojego magazynu Nextcloud za pomocą logowania jednokrotnego. Uprość zarządzanie dostępem i zwiększ wygodę użytkowników." @@ -2603,6 +2651,8 @@ pl: description: "Umożliw użytkownikom logowanie się za pośrednictwem zewnętrznych dostawców SSO przy użyciu SAML lub OpenID Connect, aby zapewnić bezproblemowy dostęp i integrację z istniejącymi systemami sprawdzania tożsamości." virus_scanning: description: "Upewnij się, że przesłane do OpenProject pliki są przeskanowane pod kątem wirusów, zanim będą dostępne dla innych użytkowników." + project_creation_wizard: + description: "Wygeneruj kreatora krok po kroku, aby pomóc kierownikom projektów wypełnić żądanie zainicjowania projektu." placeholder_users: title: Użytkownicy zastępczy description: > @@ -2902,19 +2952,17 @@ pl: learn_about: "Dowiedz się więcej o wszystkich nowych funkcjach" missing: "Nie ma jeszcze wyróżnionych funkcji." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > Wydanie zawiera różne nowe funkcje i ulepszenia, takie jak: new_features_list: - line_0: Współpraca nad dokumentami w czasie rzeczywistym. - line_1: Zdolność do strukturyzowania powiązanych projektów w programy i portfolia, aby skoncentrować je na celach strategicznych (dodatek wersji Enterprise). - line_2: Lepsze zarządzanie spotkaniami dzięki trybowi wersji roboczej, trybowi prezentacji, ulepszonym wynikom i subskrypcji iCal. - line_3: Zaktualizowana integracja usługi SharePoint z bardziej restrykcyjnymi uprawnieniami (dodatek wersji Enterprise). - line_4: Przeprojektowany przegląd projektu z nowymi kartami, konfigurowanymi widżetami i ulepszonym układem. - line_5: Opcja bardziej rygorystycznej ochrony prywatności użytkowników nie pracujących w tym samym projekcie. - line_6: Ulepszony przepływ tworzenia projektów z lepszym wyborem szablonów. - line_7: Inteligentniejsze wyszukiwanie globalne obejmujące typ i status, poprawiające precyzję w kilku autouzupełnieniach. - line_8: Ulepszenia ułatwień dostępu dzięki tekstom ALT i ulepszonym kolorom wykresów. + line_0: Zautomatyzowane inicjowanie projektów (dodatek wersji Enterprise). + line_1: "Spotkania: dodawaj nowe lub istniejące pakiety robocze jako wyniki." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Spotkania cykliczne: duplikuj punkty planu spotkania w następnym wystąpieniu." + line_4: "Udostępnianie społeczności: wyróżnianie atrybutów." + line_5: Ostrzeżenie przed otwarciem linków zewnętrznych w treści dostarczonej przez użytkownika (dodatek wersji Enterprise). + line_6: Ulepszona wydajność i wrażenia użytkownika, w tym karta Aktywność i moduł Dokumenty. links: upgrade_enterprise_edition: "Aktualizuj do wersji Enterprise" postgres_migration: "Migrowanie instalacji do PostgreSQL" @@ -2982,14 +3030,17 @@ pl: instructions_after_error: "Można spróbować się zalogować ponownie klikając %{signin}. Jeśli ten błąd będzie się powtarzał, poproś swojego admina o pomoc." menus: admin: - mail_notification: "Powiadomienia e-mail" - mails_and_notifications: "Wiadomości e-mail i powiadomienia" + ai: "Sztuczna inteligencja (AI)" aggregation: "Agregacja" api_and_webhooks: "Interfejs API i webhooki" + mail_notification: "Powiadomienia e-mail" + mails_and_notifications: "Wiadomości e-mail i powiadomienia" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Dodaj…" my_account: access_tokens: + description: "Tokeny dostawcy są wydawane przez OpenProject, co umożliwia dostęp do nich innym aplikacjom. Tokeny klienta są wydawane przez inne aplikacje, co umożliwia dostęp do nich oprogramowaniu OpenProject." no_results: title: "Brak tokenów dostępu" description: "Wszystkie elementy zostały wyłączone. Można je ponownie włączyć w menu administratora." @@ -2999,34 +3050,56 @@ pl: expiration: "Wygasa" indefinite_expiration: "Nigdy" simple_revoke_confirmation: "Czy na pewno chcesz unieważnić ten token?" + tabs: + client: + title: "Tokeny klienta" + provider: + title: "Tokeny dostawcy" token/api: + blank_description: "Nie ma jeszcze tokenu API. Możesz go utworzyć za pomocą poniższego przycisku." + blank_title: "Brak tokenu API" title: "API" + table_title: "Tokeny API" text_hint: "Tokeny API pozwalają aplikacjom innych firm na komunikowanie się z tym wystąpieniem OpenProject za pośrednictwem interfejsu API REST." - disabled_text: "Tokeny API nie zostały włączone przez administratora. Aby użyć tej funkcji, skontaktuj się z administratorem." - add_button: "Token interfejsu API" - api: static_token_name: "Token API" + disabled_text: "Tokeny API nie zostały włączone przez administratora. Aby użyć tej funkcji, skontaktuj się z administratorem." + add_button: "Token API" ical: + blank_description: "Aby dodać token iCalendar, subskrybuj nowy lub istniejący kalendarz z modułu Kalendarz projektu. Musisz mieć niezbędne uprawnienia." + blank_title: "Brak tokenu iCalendar" title: "iCalendar" + table_title: "Tokeny iCalendar" text_hint_link: "Tokeny iCalendar pozwalają użytkownikom [subskrybować kalendarze OpenProject](docs_url) i przeglądać aktualne informacje o pakietach roboczych z klientów zewnętrznych." disabled_text: "Subskrypcje iCalendar nie zostały włączone przez administratora. Aby użyć tej funkcji, skontaktuj się z administratorem." - empty_text_hint: "Aby dodać token iCalendar, subskrybuj nowy lub istniejący kalendarz z modułu Kalendarz projektu. Musisz mieć niezbędne uprawnienia." - oauth: + oauth_application: + active_tokens: "Aktywne tokeny" + blank_description: "Nie masz skonfigurowanego i aktywnego dostępu do aplikacji innych firm." + blank_title: "Brak tokenu aplikacji OAuth" + last_used_at: "Ostatnie użycie" title: "OAuth" - text_hint: "Tokeny OAuth pozwalają aplikacjom innych firm na łączenie się z tym wystąpieniem OpenProject." - empty_text_hint: "Nie masz skonfigurowanego i aktywnego dostępu do aplikacji innych firm. Aby aktywować tę funkcję, skontaktuj się z administratorem." - rss: + table_title: "Tokeny aplikacji OAuth" + text_hint: "Tokeny aplikacji OAuth pozwalają aplikacjom innych firm na łączenie się z tym wystąpieniem OpenProject." + oauth_client: + blank_description: "Nie ma jeszcze tokenów klienta OAuth." + blank_title: "Brak tokenów klienta OAuth" + failed: "Wystąpił błąd i nie można było usunąć tokenu. Spróbuj ponownie później." + integration_type: "Typ integracji" + table_title: "Tokeny klienta OAuth" + text_hint: "Tokeny klienta OAuth umożliwiają temu wystąpieniu OpenProject łączenie się z aplikacjami zewnętrznymi, takimi jak magazyny plików." + title: "OAuth" + remove_token: "Czy na pewno chcesz usunąć ten token? Trzeba będzie zalogować się ponownie w %{integration}." + removed: "Token klienta OAuth został usunięty" + unknown_integration: "Nieznany" + token/rss: + add_button: "Token RSS" + blank_description: "Nie ma jeszcze tokenu RSS. Możesz go utworzyć za pomocą poniższego przycisku." + blank_title: "Brak tokenu RSS" title: "RSS" + table_title: "Tokeny RSS" text_hint: "Tokeny RSS pozwalają użytkownikom na otrzymywanie informacji o najnowszych zmianach w tym wystąpieniu OpenProject za pośrednictwem zewnętrznego czytnika RSS." static_token_name: "Token RSS" disabled_text: "Tokeny RSS nie zostały włączone przez administratora. Aby użyć tej funkcji, skontaktuj się z administratorem." storages: - title: "Magazyny plików" - text_hint: "Tokeny magazynów plików łączą to wystąpienie OpenProject z zewnętrznym magazynem plików." - empty_text_hint: "Nie ma dostępu do magazynu podłączonego do Twojego konta." - revoke_token: "Czy na pewno chcesz usunąć ten token? Trzeba będzie zalogować się ponownie w %{storage}" - removed: "Token magazynu plików został usunięty" - failed: "Wystąpił błąd i nie można było usunąć tokena. Spróbuj ponownie później." unknown_storage: "Nieznany magazyn" notifications: reasons: @@ -3088,6 +3161,7 @@ pl: label_always_visible: "Zawsze wyświetlana" label_announcement: "Ogłoszenie" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Klucz dostępu API" label_api_access_key_created_on: "Klucz API utworzony %{value} temu" label_api_access_key_type: "API" @@ -3343,6 +3417,7 @@ pl: label_journal_diff: "Opis porównania" label_language: "Język" label_languages: "Języki" + label_external_links: "Linki zewnętrzne" label_locale: "Język i region" label_jump_to_a_project: "Skok do projektu..." label_keyword_plural: "Słowa kluczowe" @@ -3520,9 +3595,6 @@ pl: label_project_hierarchy: "Hierarchia projektu" label_project_mappings: "Projekty" label_project_new: "Nowy projekt" - label_project_initiation_request: "Żądanie zainicjowania nowego projektu" - label_project_creation_wizard: "Kreator tworzenia nowego projektu" - label_project_mandate: "Nowe zlecenie projektowe" label_project_plural: "Projekty" label_project_list_plural: "Listy projektów" label_project_life_cycle: "Cykl życia projektu" @@ -3987,7 +4059,7 @@ pl: notice_not_authorized: "Brak uprawnień dostępu do tej strony." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Brak tokenu wersji Enterprise lub nie zezwala ona na dostęp do tej strony." - notice_password_confirmation_failed: "Nieprawidłowe hasło. Nie można kontynuować." + notice_password_confirmation_failed: "Wprowadzone hasło jest nieprawidłowe." notice_principals_found_multiple: "Znaleziono %{number} wyników.\nNaciśnij Tab, aby wybrać pierwszy rezultat." notice_principals_found_single: "Znaleziono 1 wynik.\nNaciśnij Tab, aby go wybrać." notice_parent_item_not_found: "Nie znaleziono elementu nadrzędnego." @@ -4340,6 +4412,9 @@ pl: setting_allowed_link_protocols: "Dozwolone protokoły linków" setting_allowed_link_protocols_text_html: >- Zezwalaj na renderowanie tych protokołów jako linków w opisach pakietów roboczych, długich polach tekstowych i komentarzach. Na przykład %{tel_code} lub %{element_code}. Wprowadź każdy protokół w jednym wierszu.
    Protokoły %{http_code}, %{https_code} i %{mailto_code} są zawsze dozwolone. + setting_capture_external_links: "Przechwyć linki zewnętrzne" + setting_capture_external_links_text: > + Po włączeniu tej funkcji wszystkie linki zewnętrzne w tekście formatowanym będą przekierowywać na stronę z ostrzeżeniem przed opuszczeniem aplikacji. Pomaga to chronić użytkowników przed potencjalnie złośliwymi zewnętrznymi witrynami internetowymi. setting_after_first_login_redirect_url: "Przekierowanie pierwszego logowania" setting_after_first_login_redirect_url_text_html: > Ustaw ścieżkę przekierowania użytkowników po ich pierwszym zalogowaniu. Jeśli jest pusta, przekierowuje do strony głównej wycieczki wdrożeniowej.
    Przykład: /my/page @@ -4352,11 +4427,17 @@ pl: setting_apiv3_cors_origins_text_html: > Jeśli mechanizm CORS jest włączony, są to źródła, których dostęp do interfejsu API OpenProject jest dozwolony.
    Sprawdź w dokumentacji nagłówka origin jak należy określić oczekiwane wartości. setting_apiv3_write_readonly_attributes: "Dostęp do zapisu do atrybutów tylko do odczytu" - setting_apiv3_write_readonly_attributes_instructions_html: > - Jeśli ta opcja jest włączona, interfejs API zezwoli administratorom na zapisywanie podczas tworzenia statycznych atrybutów tylko do odczytu, takich jak createdAt i author.
    Ostrzeżenie: to ustawienie ma zastosowanie np. do importowania danych, ale umożliwia administratorom podszywanie się pod tworzenie elementów jako inni użytkownicy. Wszystkie żądania utworzenia są jednak rejestrowane z faktycznym autorem.
    Więcej informacji na temat atrybutów i obsługiwanych zasobów zawiera %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Jeśli funkcja ta jest włączona, interfejs API pozwoli administratorom na zapisywanie podczas tworzenia statycznych atrybutów tylko do odczytu, takich jak createdAt i author. + setting_apiv3_write_readonly_attributes_warning: > + To ustawienie ma zastosowanie np. do importowania danych, ale pozwala administratorom na podszywanie się pod innych użytkowników podczas tworzenia elementów. Wszystkie żądania utworzenia są jednak rejestrowane z prawdziwym autorem. + setting_apiv3_write_readonly_attributes_additional: > + Więcej informacji na temat atrybutów i obsługiwanych zasobów można znaleźć na stronie %{api_documentation_link}. setting_apiv3_max_page_size: "Maksymalny rozmiar strony interfejsu API" - setting_apiv3_max_page_instructions_html: > - Ustaw maksymalny rozmiar strony, którą będzie odpowiadać interfejs API. Nie będzie możliwe wykonanie żądań interfejsu API, które zwracają więcej wartości na jednej stronie.
    Ostrzeżenie: zmień tę wartość tylko mając pewność, dlaczego jej potrzebujesz. Ustawienie wysokiej wartości będzie mieć znaczące skutki dla wydajności, podczas gdy wartość niższa niż opcje liczby elementów na stronie spowodują błędy w widokach stronicowanych. + setting_apiv3_max_page_size_instructions: > + Ustaw maksymalny rozmiar strony, jakim będzie odpowiadać interfejs API. Nie będzie możliwe wykonywanie żądań interfejsu API, które zwracają więcej wartości na jednej stronie. + setting_apiv3_max_page_size_warning: > + Zmieniaj tę wartość tylko mając pewność, że jest to potrzebne. Ustawienie wysokiej wartości znacznie wpływa na wydajność, a wartość niższa niż liczba opcji na jednej stronie spowoduje błędy w stronicowanych widokach. setting_apiv3_docs: "Dokumentacja" setting_apiv3_docs_enabled: "Włącz stronę z dokumentami" setting_apiv3_docs_enabled_instructions_html: > @@ -4541,7 +4622,7 @@ pl: omniauth_direct_login_hint_html: > Jeśli ta opcja jest aktywna, żądania logowania będą przekierowywane do skonfigurowanego dostawcy omniauth. Lista rozwijana logowania i strona logowania zostaną wyłączone.
    Uwaga: o ile nie wyłączono również logowania hasłem, przy włączonej tej opcji użytkownicy mogą nadal logować się wewnętrznie, odwiedzając stronę logowania %{internal_path}. remapping_existing_users_hint: > - Jeśli opcja ta jest włączona, umożliwia dowolnemu skonfigurowanemu dostawcy tożsamości logowanie istniejących użytkowników na podstawie ich adresów e-mail, nawet jeśli użytkownik nigdy wcześniej nie logował się za pośrednictwem tego dostawcy. Może to być przydatne podczas migracji wystąpienia OpenProject do nowego dostawcy SSO, ale nie jest zalecane w przypadku korzystania z dostawcy, który nie jest zaufany dla wszystkich użytkowników wystąpienia. + Jeśli opcja ta jest włączona, umożliwia dowolnemu skonfigurowanemu dostawcy tożsamości logowanie istniejących użytkowników na podstawie ich nazw użytkowników, nawet jeśli użytkownik nigdy wcześniej nie logował się za pośrednictwem tego dostawcy. Może to być przydatne podczas migracji wystąpienia OpenProject do nowego dostawcy SSO, ale nie jest zalecane w przypadku korzystania z dostawcy, który nie jest zaufany dla wszystkich użytkowników wystąpienia. attachments: whitelist_text_html: > Zdefiniuj listę poprawnych rozszerzeń plików i/lub typów mime dla przesłanych plików.
    Wprowadź rozszerzenia plików (np. %{ext_example}) lub typy mime (np. %{mime_example}).
    Pozostaw puste, aby umożliwić przesłanie dowolnego typu pliku. Dozwolone wielokrotne wartości (jeden wiersz dla każdej wartości). @@ -4815,6 +4896,7 @@ pl: Uwaga: jeśli opcja jest włączona, w panelu administracyjnym %{information_panel_label} oraz na stronie głównej wyświetlona zostanie plakietka ze statusem instalacji. Jest ona wyświetlana tylko administratorom.
    Plakietka uruchomi kontrolę bieżącej wersji OpenProject w porównaniu do oficjalnej bazy danych wersji OpenProject, aby ostrzec o wszelkich aktualizacjach lub znanych lukach. Więcej informacji na temat tego, co zapewnia kontrola, jakie dane są potrzebne do podania dostępnych aktualizacji i jak wyłączyć tę kontrolę zawiera dokumentacja konfiguracji. text_own_membership_delete_confirmation: "Chcesz usunąć niektóre lub wszystkie swoje uprawnienia, przez które możesz nie być w stanie edytować tego projektu.\nCzy na pewno chcesz kontynuować?" text_permanent_delete_confirmation_checkbox_label: "Rozumiem, że tego usunięcia nie można cofnąć" + text_permanent_remove_confirmation_checkbox_label: "Rozumiem, że tego usunięcia nie można cofnąć" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Napędzany przez %{link}" text_project_identifier_info: "Tylko małe litery (a-z), cyfry, myślniki i podkreślenia są dozwolone, oraz musi zaczynać się małą literą." @@ -4907,8 +4989,8 @@ pl: other: "tymczasowo zablokowane (%{count} nieudanych prób zalogowania)" confirm_status_change: "Zamierzasz zmienić status „%{name}”. Na pewno chcesz kontynuować?" deleted: "Usunięty uźytkownik" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Nie można zmienić własnego statusu użytkownika." + error_admin_change_on_non_admin: "Tylko administratorzy mogą zmieniać status użytkownika administratorów." error_status_change_failed: "Zmiana statusu użytkownika nie powiodło się z powodu następujących błędów: %{errors}" invite: Zaproś użytkownika przez email invited: zaproszony @@ -5315,3 +5397,8 @@ pl: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Opuszczanie OpenProject" + warning_message: "W ten sposób opuścisz OpenProject i odwiedzisz zewnętrzną witrynę internetową. Pamiętaj, że zewnętrzne witryny internetowe nie są pod naszą kontrolą i mogą mieć różne polityki prywatności i zabezpieczeń." + continue_message: "Czy na pewno chcesz przejść do następującego linku zewnętrznego?" + continue_button: "Przejdź do zewnętrznej witryny internetowej" diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 84cc41ef91f..2b540b5e571 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -109,6 +109,23 @@ pt-BR: explanation: text: "As ações individuais de um usuário (por exemplo, atualizar um pacote de trabalho duas vezes) são agregadas em uma única ação se o intervalo de tempo for menor que o intervalo especificado. Eles serão exibidos como uma única ação dentro do aplicativo. Isso também atrasará as notificações no mesmo intervalo de tempo, reduzindo o número de e-mails enviados e também afetará o atraso de %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "O protocolo de contexto do modelo permite que agentes de IA forneçam aos seus usuários ferramentas e recursos disponibilizados por esta instância do OpenProject." + resources_heading: "Recursos" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Atualizar recursos" + tools_heading: "Ferramentas" + tools_description: "O OpenProject implementa as seguintes ferramentas. Cada uma pode ser habilitada, renomeada e descrita conforme desejado. Para mais informações, consulte a [documentação sobre ferramentas MCP](docs_url)." + tools_submit: "Atualizar ferramentas" + multi_update: + success: "Configurações MCP atualizadas com sucesso." + server_form: + description_caption: "Como o servidor MCP será descrito para outros aplicativos que se conectarem a ele." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "A configuração MCP não pôde ser atualizada." + success: "Configuração MCP atualizada com sucesso." scim_clients: authentication_methods: sso: "JWT do provedor de identidade" @@ -590,6 +607,7 @@ pt-BR: is_for_all_blank_slate: heading: Para todos os projetos description: Este atributo de projeto está ativado em todos os projetos, pois a opção “Para todos os projetos” está selecionada. Não é possível desativá-lo para projetos individuais. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Atualmente, não há tipos disponíveis. form: @@ -604,6 +622,9 @@ pt-BR: work_package_priorities: new_label: "Nova prioridade" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "O artefato gerado será salvo como um anexo PDF no pacote de trabalho do artefato." description_file_link_export: "O pacote de trabalho do artefato incluirá um link para um PDF armazenado em um armazenamento de arquivos externo. É necessário que o armazenamento ofereça gerenciamento automático de pastas por projeto. Atualmente, apenas armazenamentos Nextcloud são compatíveis." @@ -617,6 +638,7 @@ pt-BR: label_request_submission: "Envio de solicitação" project_attributes_description: > Selecione quais atributos do projeto devem ser incluídos na solicitação de início do projeto. Esta lista inclui apenas [atributos do projeto](project_attributes_url) habilitados para este projeto. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Editar status wizard: @@ -712,9 +734,11 @@ pt-BR: create_button: "Criar" name_label: "Nome do token" created_dialog: + one_time_warning: "Esta é a única vez que você verá este token. Certifique-se de copiá-lo agora." token/api: title: "O token de API foi gerado" - warning: "Esta é a única vez que você verá este token. Certifique-se de copiá-lo agora." + token/rss: + title: "O token de RSS foi gerado" failed_to_reset_token: "Falha ao redefinir o token de acesso: %{error}" failed_to_create_token: "Falha ao criar o token de acesso: %{error}" failed_to_revoke_token: "Falha ao revogar o token de acesso: %{error}" @@ -724,6 +748,9 @@ pt-BR: notice_api_token_revoked: "O token de API foi excluído. Para criar um novo token, use o botão na seção de API." notice_rss_token_revoked: "O token RSS foi excluído. Para criar um novo token, use o link na seção do RSS." notice_ical_token_revoked: 'O token iCalendar "%{token_name}" para o calendário "%{calendar_name}" do projeto "%{project_name}" foi revogado. O URL do iCalendar com este token agora é inválido.' + password_confirmation_dialog: + confirmation_required: "É necessário inserir a senha da sua conta para confirmar esta alteração." + title: "Confirme sua senha para continuar" news: index: no_results_title_text: Atualmente, não há notícias para comunicar. @@ -1228,6 +1255,10 @@ pt-BR: onthefly: "Criação automática de usuário" port: "Porta" tls_certificate_string: "Certificado SSL do servidor LDAP" + mcp_configuration: + enabled: Habilitado + title: Título + description: Descrição member: roles: "Papéis" notification: @@ -1486,6 +1517,7 @@ pt-BR: even: "deve ser par." exclusion: "está reservado." feature_disabled: não está disponível. + feature_disabled_for_project: está desativado para este projeto. file_too_large: "é muito grande (tamanho máximo é %{count} Bytes)." filter_does_not_exist: "filtro não existe." format: "não corresponde ao formato '%{expected}' esperado." @@ -1508,7 +1540,8 @@ pt-BR: not_a_datetime: "não é uma data/hora válida." not_a_number: "não é um número." not_allowed: "é inválido devido à falta de permissões." - not_json: "não é um objeto JSON válido." + not_json: "não pode ser analisado como JSON." + not_json_object: "não é um objeto JSON." not_an_integer: "não é um número inteiro." not_an_iso_date: "não é uma data válida. Formato exigido: AAAA-MM-DD." not_same_project: "não pertence ao mesmo projeto." @@ -1916,7 +1949,12 @@ pt-BR: token/api: one: Token de acesso other: Tokens de acesso - type: "Tipo" + token/rss: + one: "Token RSS" + other: "Tokens RSS" + type: + one: "Tipo" + other: "Tipos" user: "Usuário" version: "Versão" workflow: "Fluxo de Trabalho" @@ -2133,6 +2171,7 @@ pt-BR: button_click_to_reveal: "Clique para revelar" button_close: "Fechar" button_collapse_all: "Recolher todos" + button_confirm: "Confirmar" button_configure: "Configurar" button_continue: "Continuar" button_complete: "Concluir" @@ -2165,6 +2204,7 @@ pt-BR: button_print: "Imprimir" button_quote: "Citar" button_remove: Remover + button_remove_permanently: "Remover permanentemente" button_remove_reminder: "Remover lembrete" button_rename: "Renomear" button_replace: "Substituir" @@ -2416,7 +2456,7 @@ pt-BR: baseline_comparison: Comparações de linha base board_view: Quadros avançados calculated_values: Valores calculados - conditional_highlighting: Realce condicional + capture_external_links: Capturar links externos internal_comments: Comentários internos custom_actions: Ações Personalizadas custom_field_hierarchies: Hierarquias @@ -2426,10 +2466,12 @@ pt-BR: edit_attribute_groups: Editar atributo de grupos gantt_pdf_export: Exportar diagrama de Gantt para PDF ldap_groups: Sincronização de usuários e grupos LDAP + mcp_server: Servidor MCP nextcloud_sso: Autenticação única para o armazenamento do Nextcloud one_drive_sharepoint_file_storage: Armazenamento de Arquivos OneDrive/SharePoint placeholder_users: Usuários Genéricos portfolio_management: Gestão de portfólio + project_creation_wizard: Solicitação de início de projeto project_list_sharing: Compartilhamento de Lista de Projetos readonly_work_packages: Pacotes de Trabalho somente leitura scim_api: API do servidor SCIM @@ -2470,8 +2512,8 @@ pt-BR: description: "Crie assuntos gerados automaticamente com base em atributos e textos referenciados." customize_life_cycle: description: "Criar e organizar fases do projeto diferentes das fornecidas pelo planejamento do ciclo de projeto PM2." - conditional_highlighting: - description: "Precisa que determinados pacotes de trabalho se destaquem? Utilize o destaque condicional na tabela de pacotes de trabalho." + capture_external_links: + description: "Evite ataques de engenharia social detectando e alertando sobre links externos antes que os usuários os acessem." work_package_query_relation_columns: description: "Precisa visualizar as relações ou elementos filhos na lista de pacotes de trabalho?" edit_attribute_groups: @@ -2501,6 +2543,8 @@ pt-BR: custom_actions: title: "Ações personalizadas" description: "As ações personalizadas são atalhos de clique único para um conjunto de ações pré-definidas que você pode disponibilizar em certos pacotes de trabalho com base no estado, função, tipo ou projeto." + mcp_server: + description: "Integre agentes de IA à sua instância do OpenProject por meio do MCP." nextcloud_sso: title: "Autenticação única para o armazenamento do Nextcloud" description: "Ative a autenticação segura e contínua para o seu armazenamento Nextcloud com Autenticação única. Simplifique o gerenciamento de acessos e melhore a experiência do usuário." @@ -2512,6 +2556,8 @@ pt-BR: description: "Permitir que os usuários façam login por meio de provedores SSO externos usando SAML ou OpenID Connect, garantindo acesso contínuo e integração com os sistemas de identidade existentes." virus_scanning: description: "Garantir que os arquivos carregados no OpenProject sejam verificados quanto à presença de vírus antes de serem acessados por outros usuários." + project_creation_wizard: + description: "Gerar um assistente detalhado para ajudar os gerentes de projeto a preencher uma solicitação de início de projeto." placeholder_users: title: Usuários de espaço reservado description: > @@ -2809,19 +2855,17 @@ pt-BR: learn_about: "Saiba mais sobre todos os novos recursos" missing: "Ainda não há recursos destacados." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > - A versão contém diversos novos recursos e melhorias, como: + A versão traz diversos novos recursos e melhorias, como: new_features_list: - line_0: Colaboração em documentos em tempo real. - line_1: Capacidade de organizar projetos relacionados em programas e portfólios para alinhá-los aos objetivos estratégicos (complemento Enterprise). - line_2: Melhor gestão de reuniões com modo rascunho, modo de apresentação, resultados aprimorados e assinatura iCal. - line_3: Integração com SharePoint atualizada com permissões mais restritivas (complemento Enterprise). - line_4: Visão geral do projeto reformulada, com novas abas, widgets configuráveis e layout aprimorado. - line_5: Opção para proteger melhor a privacidade de usuários que não participam do mesmo projeto. - line_6: Fluxo de criação de projetos aprimorado, com seleção de modelos mais eficiente. - line_7: Busca global mais inteligente, incluindo tipo e status, aumentando a precisão em diversos autocompletadores. - line_8: Melhorias de acessibilidade com textos ALT e cores de gráfico aprimoradas. + line_0: Início de projeto automatizado (complementos Enterprise). + line_1: "Reuniões: adicionar pacotes de trabalho novos ou existentes como resultados." + line_2: "Reuniões: exibir respostas do iCal no OpenProject." + line_3: "Reuniões recorrentes: duplicar itens da pauta para a próxima ocorrência." + line_4: "Versão para a comunidade: Realce de atributos." + line_5: Aviso antes de abrir links externos em conteúdo fornecido pelo usuário (complementos Enterprise). + line_6: Desempenho e experiência do usuário aprimorados, incluindo a aba Atividade e o módulo Documentos. links: upgrade_enterprise_edition: "Atualizar para a edição Enterprise" postgres_migration: "Migrando sua instalação para PostgreSQL" @@ -2889,14 +2933,17 @@ pt-BR: instructions_after_error: "Você pode tentar entrar novamente, clicando em %{signin}. Se o erro persistir, consulte seu administrador para obter ajuda." menus: admin: - mail_notification: "Notificações por e-mail" - mails_and_notifications: "E-mails e notificações" + ai: "Inteligência artificial (IA)" aggregation: "Agregação" api_and_webhooks: "API e webhooks" + mail_notification: "Notificações por e-mail" + mails_and_notifications: "E-mails e notificações" + mcp_configurations: "Protocolo de Contexto de Modelo (MCP)" quick_add: label: "Adicionar…" my_account: access_tokens: + description: "Tokens de provedor são emitidos pelo OpenProject, permitindo que outros aplicativos tenham acesso a ele. Tokens de cliente são emitidos por outros aplicativos, permitindo que o OpenProject tenha acesso a eles." no_results: title: "Nenhum tokens de acesso para exibir" description: "Todos foram desativados. Eles podem ser re-ativados no menu Administração." @@ -2906,34 +2953,56 @@ pt-BR: expiration: "Expira" indefinite_expiration: "Nunca" simple_revoke_confirmation: "Tem certeza de que deseja revogar este token?" + tabs: + client: + title: "Tokens do cliente" + provider: + title: "Tokens de provedor" token/api: + blank_description: "Ainda não há um token de API. Você pode criar um usando o botão abaixo." + blank_title: "Sem token de API" title: "API" + table_title: "Tokens de API" text_hint: "Os tokens de API permitem que aplicativos de terceiros se comuniquem com esta instância do OpenProject por meio de APIs REST." + static_token_name: "Token de API" disabled_text: "Os tokens de API não estão habilitados pelo administrador. Entre em contato com o administrador para utilizar este recurso." add_button: "Token de API" - api: - static_token_name: "Token de API" ical: + blank_description: "Para adicionar um token iCalendar, assine um calendário novo ou existente pelo módulo Calendário de um projeto. É necessário ter as permissões adequadas." + blank_title: "Sem token iCalendar" title: "iCalendar" + table_title: "Tokens iCalendar" text_hint_link: "Tokens de iCalendar permitem que os usuários [assinem calendários do OpenProject](docs_url) e vejam informações atualizadas dos pacotes de trabalho de clientes externos." disabled_text: "As assinaturas do iCalendar não estão habilitadas pelo administrador. Entre em contato com o administrador para utilizar este recurso." - empty_text_hint: "Para adicionar um token de iCalendário, assine um calendário novo ou existente no módulo Calendário de um projeto. Você precisa possuir as permissões necessárias." - oauth: + oauth_application: + active_tokens: "Tokens ativos" + blank_description: "Não há nenhum acesso ativo de aplicativos de terceiros configurado para sua conta." + blank_title: "Sem token de aplicativo OAuth" + last_used_at: "Último uso em" title: "OAuth" - text_hint: "Os tokens de OAuth permitem que aplicativos de terceiros se conectar com esta instância do OpenProject." - empty_text_hint: "Não há acesso de aplicativo de terceiros configurado e ativo para você. Entre em contato com o administrador para ativar este recurso." - rss: - title: "RSS" - text_hint: "Os tokens de RSS permitem que os usuários acompanhem as últimas alterações nesta instância do OpenProject através de um leitor de RSS externo." - static_token_name: "Token de RSS" - disabled_text: "Os tokens de RSS não estão habilitados pelo administrador. Entre em contato com o administrador para utilizar este recurso." - storages: - title: "Armazenamento de arquivos" - text_hint: "Tokens de Armazenamento de Arquivo conectam esta instância do OpenProject a um Armazenamento de Arquivos externo." - empty_text_hint: "Não há nenhum acesso de armazenamento vinculado à sua conta." - revoke_token: "Você realmente deseja remover este token? Você precisará fazer login novamente no %{storage}" - removed: "Token de armazenamento de arquivo removido com sucesso" + table_title: "Tokens de aplicativo OAuth" + text_hint: "Tokens de aplicativo OAuth permitem que aplicativos de terceiros se conectem a esta instância do OpenProject." + oauth_client: + blank_description: "Ainda não há tokens de cliente OAuth." + blank_title: "Sem tokens de cliente OAuth" failed: "Ocorreu um erro e o token não pôde ser removido. Tente novamente mais tarde." + integration_type: "Tipo de integração" + table_title: "Tokens de cliente OAuth" + text_hint: "Tokens de cliente OAuth permitem que esta instância do OpenProject se conecte a aplicativos externos, como serviços de armazenamento de arquivos." + title: "OAuth" + remove_token: "Tem certeza de que deseja remover este token? Será necessário fazer login novamente no %{integration}." + removed: "Token de cliente OAuth removido com sucesso" + unknown_integration: "Desconhecido" + token/rss: + add_button: "Token RSS" + blank_description: "Ainda não há um token de RSS. Você pode criar um usando o botão abaixo." + blank_title: "Sem token de RSS" + title: "RSS" + table_title: "Tokens RSS" + text_hint: "Tokens RSS permitem que os usuários acompanhem as últimas alterações desta instância do OpenProject por meio de um leitor RSS externo." + static_token_name: "Token RSS" + disabled_text: "Tokens RSS não estão habilitados pelo administrador. Entre em contato com ele para usar este recurso." + storages: unknown_storage: "Armazenamento desconhecido" notifications: reasons: @@ -2995,6 +3064,7 @@ pt-BR: label_always_visible: "Sempre exibido" label_announcement: "Anúncio" label_angular: "AngularJS" + label_app_modules: "%{app_title} módulos" label_api_access_key: "Chave de acesso a API" label_api_access_key_created_on: "Chave de acesso a API criada %{value} atrás" label_api_access_key_type: "API" @@ -3250,6 +3320,7 @@ pt-BR: label_journal_diff: "Comparação de Descrição" label_language: "Idioma" label_languages: "Idiomas" + label_external_links: "Links externos" label_locale: "Idioma e região" label_jump_to_a_project: "Saltar para um projeto..." label_keyword_plural: "Palavras-chave" @@ -3427,9 +3498,6 @@ pt-BR: label_project_hierarchy: "Hierarquia de projeto" label_project_mappings: "Projetos" label_project_new: "Novo projeto" - label_project_initiation_request: "Nova solicitação de início de projeto" - label_project_creation_wizard: "Novo assistente de criação de projeto" - label_project_mandate: "Nova autorização de projeto" label_project_plural: "Projetos" label_project_list_plural: "Listas de projeto" label_project_life_cycle: "Ciclo de vida do projeto" @@ -3892,7 +3960,7 @@ pt-BR: notice_not_authorized: "Você não está autorizado a acessar esta página." notice_not_authorized_archived_project: "O projeto que você está tentando acessar foi arquivado." notice_requires_enterprise_token: "O token Enterprise está ausente ou não permite acesso a esta página." - notice_password_confirmation_failed: "Sua senha não está correta. Não é possível continuar." + notice_password_confirmation_failed: "A senha informada está incorreta." notice_principals_found_multiple: "Existe(m) %{number} resultado(s) encontrado(s).\nTecle tab para ir ao primeiro resultado." notice_principals_found_single: "Existe um resultado. Tecle tab para ir para ele." notice_parent_item_not_found: "Item pai não encontrado." @@ -4245,6 +4313,9 @@ pt-BR: setting_allowed_link_protocols: "Protocolos de link permitidos" setting_allowed_link_protocols_text_html: >- Permite que estes protocolos sejam apresentados como links nas descrições do pacote de trabalho, campos de texto e comentários. Por exemplo, %{tel_code} ou %{element_code}. Insira um protocolo por linha.
    Os protocolos %{http_code}, %{https_code} e %{mailto_code} estão sempre permitidos. + setting_capture_external_links: "Capturar links externos" + setting_capture_external_links_text: > + Quando ativado, todos os links externos em textos formatados serão redirecionados por uma página de aviso antes de sair do aplicativo. Isso ajuda a proteger os usuários de sites externos potencialmente maliciosos. setting_after_first_login_redirect_url: "Redirecionamento de primeiro login" setting_after_first_login_redirect_url_text_html: > Defina um caminho para redirecionar os usuários após o primeiro login. Se deixado em branco, eles serão redirecionados para a página inicial do tour de introdução.
    Exemplo: /my/page @@ -4257,11 +4328,17 @@ pt-BR: setting_apiv3_cors_origins_text_html: > Se o CORS estiver habilitado, essas são as origens que têm permissão para acessar a API OpenProject.
    Por favor, verifique a documentação na header da Origin sobre como especificar os valores esperados. setting_apiv3_write_readonly_attributes: "Acesso de gravação a atributos somente leitura" - setting_apiv3_write_readonly_attributes_instructions_html: > - Se ativada, a API permitirá que os administradores escrevam atributos estáticos somente leitura durante a criação, como os campos createdAt e autor.
    Aviso: Esta configuração tem um caso de uso para, por exemplo, importar dados, mas permite que os administradores personifiquem a criação de itens como outros usuários. No entanto, todas as solicitações de criação estão sendo registradas com o verdadeiro autor.
    Para obter mais informações sobre atributos e recursos compatíveis, consulte o site %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Se ativada, a API permitirá que os administradores gravem atributos estáticos de somente leitura durante a criação, como createdAt e author. + setting_apiv3_write_readonly_attributes_warning: > + Esta configuração tem casos de uso, por exemplo, para importação de dados, mas permite que administradores criem itens em nome de outros usuários. Todas as solicitações de criação, no entanto, são registradas com o autor verdadeiro. + setting_apiv3_write_readonly_attributes_additional: > + Para obter mais informações sobre atributos e recursos suportados, consulte %{api_documentation_link}. setting_apiv3_max_page_size: "Tamanho máximo da página de API" - setting_apiv3_max_page_instructions_html: > - Defina o tamanho máximo de página com o qual a API responderá. Não será possível realizar solicitações de API que retornem mais valores em uma única página.
    Aviso: Somente altere este valor se tiver certeza do motivo de sua necessidade. Definir um valor alto resultará em impactos significativos no desempenho, enquanto um valor menor que as opções por página causará erros nas visualizações paginadas. + setting_apiv3_max_page_size_instructions: > + Defina o tamanho máximo de página que a API irá retornar. Não será possível realizar solicitações à API que retornem mais valores em uma única página. + setting_apiv3_max_page_size_warning: > + Altere este valor apenas se tiver certeza de que é necessário. Configurar um valor alto pode gerar impacto significativo no desempenho, enquanto um valor menor do que as opções por página causará erros em visualizações paginadas. setting_apiv3_docs: "Documentação" setting_apiv3_docs_enabled: "Habilitar página de documentos" setting_apiv3_docs_enabled_instructions_html: > @@ -4446,7 +4523,7 @@ pt-BR: omniauth_direct_login_hint_html: > Se esta opção estiver ativada, as solicitações de login serão redirecionadas para o provedor omniauth configurado. O menu suspenso de login e a página de login serão desativados.
    Obs.: A menos que você também desative os logins por senha, com esta opção ativada, os usuários ainda poderão fazer login internamente acessando a página de login em %{internal_path}. remapping_existing_users_hint: > - Se ativado, permite que qualquer provedor de identidade configurado faça login de usuários existentes com base em seu endereço de e-mail, mesmo que o usuário nunca tenha acessado através desse provedor antes. Isso pode ser útil ao migrar a instância do OpenProject para um novo provedor SSO, mas não é recomendado ao usar um provedor que não seja confiável para todos os usuários da sua instância. + Se ativado, permite que qualquer provedor de identidade configurado faça login de usuários existentes com base em seu nome de usuário, mesmo que o usuário nunca tenha acessado através desse provedor antes. Isso pode ser útil ao migrar a instância do OpenProject para um novo provedor SSO, mas não é recomendado ao usar um provedor que não seja confiável para todos os usuários da sua instância. attachments: whitelist_text_html: > Defina uma lista de extensões de arquivo válidas e/ou tipos MIME para arquivos carregados.
    Insira as extensões de arquivo (e.x., %{ext_example}) ou tipos de mime (e.x., %{mime_example}).
    Deixe em branco para permitir que qualquer tipo de arquivo seja carregado. Vários valores permitidos (uma linha para cada valor). @@ -4720,6 +4797,7 @@ pt-BR: Nota: se habilitado, isto irá exibir um distintivo com o seu status de instalação no %{information_panel_label}painel de administração e na página inicial. Ele é exibido apenas para administradores.
    O distintivo verificará sua versão do OpenProject contra o banco de dados oficial de versões do OpenProject para alertá-lo de quaisquer atualizações ou vulnerabilidades conhecidas. Para obter mais informações sobre o que fornece este distintivo, quais dados necessários para fornecer atualizações disponíveis e como desativar este distintivo, por favor verifique a documentação de configuração. text_own_membership_delete_confirmation: "Você está prestes a remover algumas ou todas as permissões e você pode não ser capaz de editar este projeto depois disso. Tem certeza que deseja continuar?" text_permanent_delete_confirmation_checkbox_label: "Compreendo que esta exclusão é irreversível" + text_permanent_remove_confirmation_checkbox_label: "Compreendo que esta remoção é irreversível" text_plugin_assets_writable: "Diretório de plugins ativos é gravável" text_powered_by: "Desenvolvido por %{link}" text_project_identifier_info: "Apenas letras minúsculas (a-z), números, hífens e sublinhados são permitidos, deve-se começar com uma letra minúscula." @@ -4810,8 +4888,8 @@ pt-BR: other: "bloqueado temporariamente (%{count} tentativas de login inválidas)" confirm_status_change: "Você está prestes a mudar a situação de '%{name}'. Tem certeza que deseja continuar?" deleted: "Usuário excluído" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Você não pode alterar o seu próprio status de usuário." + error_admin_change_on_non_admin: "Somente administradores podem alterar o status de usuários administradores." error_status_change_failed: "A alteração da situação do usuário falhou devido aos seguintes erros: %{errors}" invite: Convidar usuário através de e-mail invited: convidado @@ -5215,3 +5293,8 @@ pt-BR: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Saindo do OpenProject" + warning_message: "Você está prestes a sair do OpenProject e acessar um site externo. Lembre-se de que sites externos não estão sob nosso controle e podem ter políticas de privacidade e segurança diferentes." + continue_message: "Tem certeza de que deseja acessar o seguinte link externo?" + continue_button: "Continuar para o site externo" diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 01f240c8c48..252e35cb532 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -109,6 +109,23 @@ pt-PT: explanation: text: "As ações individuais de um utilizador (por exemplo, atualizar um pacote de trabalho duas vezes) são agregadas numa única ação se a sua diferença de idade for menor que o intervalo de tempo especificado. Serão mostradas como uma única ação dentro da aplicação. Também vai atrasar as notificações pelo mesmo período de tempo, o que reduz o número de e-mails enviados, e afeta ainda o atraso de %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "O protocolo de contexto do modelo permite que os agentes de IA forneçam aos seus utilizadores ferramentas e recursos expostos por esta instância do OpenProject." + resources_heading: "Recursos" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Atualizar recursos" + tools_heading: "Ferramentas" + tools_description: "O OpenProject implementa as seguintes ferramentas. Cada uma pode ser ativada, renomeada e descrita como quiser. Para mais informações, consulte a [documentação sobre ferramentas MCP](docs_url)." + tools_submit: "Atualizar ferramentas" + multi_update: + success: "As configurações da MCP foram atualizadas com êxito." + server_form: + description_caption: "Como o servidor MCP será descrito a outras aplicações que se ligam a ele." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "Não foi possível atualizar a configuração MCP." + success: "A configuração da MCP foi atualizada com êxito." scim_clients: authentication_methods: sso: "JWT do fornecedor de identidade" @@ -589,6 +606,7 @@ pt-PT: is_for_all_blank_slate: heading: Para todos os projetos description: Este atributo do projeto é ativado em todos os projetos, uma vez que a opção "Para todos os projetos" está assinalada. Não pode ser desativado para projetos individuais. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Atualmente, não existem tipos disponíveis. form: @@ -603,6 +621,9 @@ pt-PT: work_package_priorities: new_label: "Nova prioridade" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "O artefacto gerado será guardado como anexo PDF no pacote de trabalho do artefacto." description_file_link_export: "O pacote de trabalho do artefacto terá uma ligação de ficheiro a um PDF armazenado num arquivo externo. Requer um armazenamento de ficheiros funcional com pastas de projeto geridas automaticamente para este projeto. De momento, só são suportados os armazenamentos de ficheiros Nextcloud." @@ -616,6 +637,7 @@ pt-PT: label_request_submission: "Pedido de envio" project_attributes_description: > Selecione os atributos do projeto que devem ser incluídos na solicitação de início do projeto. Esta lista inclui apenas [atributos do projeto](project_attributes_url) ativados para este projeto. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Editar estado wizard: @@ -711,9 +733,11 @@ pt-PT: create_button: "Criar" name_label: "Nome do token" created_dialog: + one_time_warning: "Esta é a única vez que verá este token. Não se esqueça de o copiar agora." token/api: title: "O token da API foi gerado" - warning: "Esta é a única vez que verá este token. Não se esqueça de o copiar agora." + token/rss: + title: "O token RSS foi gerado" failed_to_reset_token: "Não foi possível reiniciar o token de acesso: %{error}" failed_to_create_token: "Não foi possível criar o token de acesso: %{error}" failed_to_revoke_token: "Não foi possível revogar o token de acesso: %{error}" @@ -723,6 +747,9 @@ pt-PT: notice_api_token_revoked: "O token da API foi eliminado. Para criar um novo token, utilize o botão na secção da API." notice_rss_token_revoked: "O token de RSS foi eliminado. Para criar um novo token, utilize o link na secção de RSS." notice_ical_token_revoked: 'O token iCalendar "%{token_name}" para o calendário "%{calendar_name}" do projeto "%{project_name}" foi revogado. O URL do iCalendar com este token agora é inválido.' + password_confirmation_dialog: + confirmation_required: "Tem de introduzir a palavra-passe da sua conta para confirmar esta alteração." + title: "Confirme a sua palavra-passe para continuar" news: index: no_results_title_text: Atualmente, não existem notícias para comunicar. @@ -1228,6 +1255,10 @@ pt-PT: onthefly: "Criação automática de utilizador" port: "Porta" tls_certificate_string: "Certificado SSL do servidor LDAP" + mcp_configuration: + enabled: Ativado + title: Título + description: Descrição member: roles: "Papel" notification: @@ -1486,6 +1517,7 @@ pt-PT: even: "deve ser par." exclusion: "é reservado." feature_disabled: não está disponível. + feature_disabled_for_project: está desativado neste projeto. file_too_large: "é muito grande (tamanho máximo é %{count} Bytes)." filter_does_not_exist: "filtro não existe." format: "não corresponde ao formato esperado '%{expected}'." @@ -1508,7 +1540,8 @@ pt-PT: not_a_datetime: "não é uma data/hora válida." not_a_number: "não é um número." not_allowed: "é inválido devido a permissões em falta." - not_json: "não é um objeto JSON válido." + not_json: "não é analisável como JSON." + not_json_object: "não é um objeto JSON." not_an_integer: "não é um número inteiro." not_an_iso_date: "não é uma data válida. Formato exigido: AAAA-MM-DD." not_same_project: "não pertence ao mesmo projeto." @@ -1916,7 +1949,12 @@ pt-PT: token/api: one: Token de acesso other: Tokens de acesso - type: "Tipo" + token/rss: + one: "Token RSS" + other: "Tokens RSS" + type: + one: "Tipo" + other: "Tipos" user: "Utilizador" version: "Versão" workflow: "Fluxo de trabalho" @@ -2133,6 +2171,7 @@ pt-PT: button_click_to_reveal: "Clique para revelar" button_close: "Fechar" button_collapse_all: "Ocultar tudo" + button_confirm: "Confirmar" button_configure: "Configurar" button_continue: "Continuar" button_complete: "Concluído" @@ -2165,6 +2204,7 @@ pt-PT: button_print: "Imprimir" button_quote: "Citar" button_remove: Remover + button_remove_permanently: "Remover permanentemente" button_remove_reminder: "Remover lembrete" button_rename: "Alterar o nome" button_replace: "Substituir" @@ -2416,7 +2456,7 @@ pt-PT: baseline_comparison: Comparações de base de referência board_view: Quadros avançados calculated_values: Valores calculados - conditional_highlighting: Realce condicional + capture_external_links: Capturar links externos internal_comments: Comentários internos custom_actions: Ações personalizadas custom_field_hierarchies: Hierarquias @@ -2426,10 +2466,12 @@ pt-PT: edit_attribute_groups: Editar grupos de atributos gantt_pdf_export: Exportação de PDF de Gantt ldap_groups: Sincronização de utilizadores e grupos LDAP + mcp_server: Servidor MCP nextcloud_sso: Início de sessão único para armazenamento Nextcloud one_drive_sharepoint_file_storage: Armazenamento de ficheiros no OneDrive/SharePoint placeholder_users: Utilizadores de marcador de posição portfolio_management: Gestão de carteiras + project_creation_wizard: Pedido de início do projeto project_list_sharing: Partilha da lista de projetos readonly_work_packages: Pacotes de trabalho só de leitura scim_api: API do servidor SCIM @@ -2470,8 +2512,8 @@ pt-PT: description: "Crie temas gerados automaticamente utilizando atributos e texto referenciados." customize_life_cycle: description: "Crie e organize fases de projeto diferentes das fornecidas pelo planeamento do ciclo de projeto PM2." - conditional_highlighting: - description: "Precisa de certos pacotes de trabalho para se destacar do resto? Use destaque condicional na tabela de pacotes de trabalho." + capture_external_links: + description: "Evite ataques de engenharia social ao identificar e alertar para links externos antes de os utilizadores os visitarem." work_package_query_relation_columns: description: "Precisa de ver as relações ou elementos secundários na lista do pacote de trabalho?" edit_attribute_groups: @@ -2501,6 +2543,8 @@ pt-PT: custom_actions: title: "Ações personalizadas" description: "As ações personalizadas são atalhos de um clique para um conjunto de ações predefinidas que pode disponibilizar em determinados pacotes de trabalho com base no estado, função, tipo ou projeto." + mcp_server: + description: "Integre agentes de IA com a sua instância do OpenProject através de MCP." nextcloud_sso: title: "Início de sessão único para armazenamento Nextcloud" description: "Permita uma autenticação perfeita e segura para o seu armazenamento Nextcloud com o início de sessão único. Simplifique a gestão do acesso e aumente a conveniência do utilizador." @@ -2512,6 +2556,8 @@ pt-PT: description: "Permita que os utilizadores iniciem sessão através de fornecedores externos de SSO utilizando SAML ou OpenID Connect, para acesso e integração perfeitos com os sistemas de identidade existentes." virus_scanning: description: "Assegure-se que os ficheiros carregados no OpenProject são verificados quanto à presença de vírus antes de serem acessíveis a outros utilizadores." + project_creation_wizard: + description: "Crie um assistente passo a passo para ajudar os gestores de projetos a preencher um pedido de iniciação de projeto." placeholder_users: title: Utilizadores de espaço reservado description: > @@ -2809,19 +2855,17 @@ pt-PT: learn_about: "Mais informações sobre todas as novas funcionalidades" missing: "Ainda não há nenhum recurso destacado." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > A versão contém várias novas funcionalidades e melhorias, tais como: new_features_list: - line_0: Colaboração em documentos em tempo real. - line_1: Capacidade de estruturar projetos relacionados em programas e carteiras, para os concentrar em objetivos estratégicos (complemento Enterprise). - line_2: Melhor gestão de reuniões com modo de rascunho, modo de apresentação, resultados melhorados e subscrição iCal. - line_3: Integração atualizada do SharePoint com permissões mais restritivas (complemento Enterprise). - line_4: Síntese do projeto redesenhada com novos separadores, widgets configuráveis e um esquema melhorado. - line_5: Opção para proteger mais rigorosamente a privacidade dos utilizadores que não trabalham no mesmo projeto. - line_6: Melhoria do fluxo de criação de projetos com uma melhor seleção de modelos. - line_7: Pesquisa global mais inteligente, com filtros por tipo e estado, aumentando a precisão em múltiplas sugestões automáticas. - line_8: Melhorias de acessibilidade com textos ALT e cores de gráficos melhoradas. + line_0: Iniciação automatizada de projetos (complemento Enterprise). + line_1: "Reuniões: adicione pacotes de trabalho novos ou existentes como resultados." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Reuniões recorrentes: duplicar os pontos da agenda para a próxima ocorrência." + line_4: "Disponibilizar para a Comunidade: Destaque dos atributos." + line_5: Aviso antes de abrir ligações externas em conteúdos fornecidos pelo utilizador (complemento Enterprise). + line_6: Melhoria do desempenho e da experiência do utilizador, incluindo o separador Atividade e o módulo Documentos. links: upgrade_enterprise_edition: "Aprimorar para a edição Enterprise" postgres_migration: "A migrar a sua instalação para PostgreSQL" @@ -2889,14 +2933,17 @@ pt-PT: instructions_after_error: "Pode tentar entrar novamente clicando em %{signin}. Se o erro persistir, peça ajuda ao seu administrador." menus: admin: - mail_notification: "Notificações por e-mail" - mails_and_notifications: "E-mails e notificações" + ai: "Inteligência artificial (IA)" aggregation: "Agregação" api_and_webhooks: "API e webhooks" + mail_notification: "Notificações por e-mail" + mails_and_notifications: "E-mails e notificações" + mcp_configurations: "Protocolo de contexto de modelo (MCP)" quick_add: label: "Adicionar…" my_account: access_tokens: + description: "Os tokens de fornecedor são emitidos pelo OpenProject e permitem o acesso de outras aplicações. Os tokens de cliente são emitidos por outras aplicações e permitem que o OpenProject lhes aceda." no_results: title: "Sem tokens de acesso para exibir" description: "Todos foram desativados. Podem ser reativados no menu Administração." @@ -2906,34 +2953,56 @@ pt-PT: expiration: "Expira" indefinite_expiration: "Nunca" simple_revoke_confirmation: "Tem a certeza de que deseja revogar este token?" + tabs: + client: + title: "Tokens de cliente" + provider: + title: "Tokens de fornecedor" token/api: + blank_description: "Ainda não existe um token de API. Pode criar um no botão abaixo." + blank_title: "Nenhum token de API" title: "API" + table_title: "Tokens de API" text_hint: "Os tokens de API permitem que aplicações de terceiros comuniquem com esta instância do OpenProject através de API REST." + static_token_name: "Token de API" disabled_text: "Os tokens da API não são ativados pelo administrador. Contacte o seu administrador para utilizar esta funcionalidade." add_button: "Token de API" - api: - static_token_name: "Token da API" ical: + blank_description: "Para adicionar um token do iCalendar, subscreva um calendário novo ou já existente a partir do módulo Calendários de um projeto. Tem de ter as permissões necessárias." + blank_title: "Nenhum token iCalendar" title: "iCalendar" + table_title: "Tokens iCalendar" text_hint_link: "Os tokens iCalendar permitem que os utilizadores [subscrevam os calendários do OpenProject](docs_url) e vejam informações atualizadas sobre pacotes de trabalho de clientes externos." disabled_text: "As subscrições do iCalendar não são ativadas pelo administrador. Contacte o seu administrador para utilizar esta funcionalidade." - empty_text_hint: "Para adicionar um token do iCalendar, subscreva um calendário novo ou já existente a partir do módulo Calendários de um projeto. Tem de ter as permissões necessárias." - oauth: + oauth_application: + active_tokens: "Tokens ativos" + blank_description: "Não existe um acesso a aplicações de terceiros configurado e ativo para si." + blank_title: "Nenhum token de aplicação OAuth" + last_used_at: "Data de última utilização" title: "OAuth" - text_hint: "Os tokens de OAuth permitem que as aplicações externas se liguem a esta instância do OpenProject." - empty_text_hint: "Não existe nenhum acesso a aplicações externas configurado e ativo para si. Contacte o seu administrador para ativar esta funcionalidade." - rss: + table_title: "Tokens de aplicação OAuth" + text_hint: "Os tokens de aplicação OAuth permitem que aplicações de terceiros se liguem a esta instância do OpenProject." + oauth_client: + blank_description: "Ainda não existem tokens de cliente OAuth." + blank_title: "Nenhum token de cliente OAuth" + failed: "Ocorreu um erro e não foi possível remover o token. Tente novamente mais tarde." + integration_type: "Tipo de integração" + table_title: "Tokens do cliente OAuth" + text_hint: "Os tokens de cliente OAuth permitem que esta instância do OpenProject se ligue a aplicações externas, como armazenamentos de ficheiros." + title: "OAuth" + remove_token: "Tem a certeza de que deseja remover este token? Terá de iniciar sessão novamente em %{integration}." + removed: "Token de cliente OAuth removido com sucesso" + unknown_integration: "Desconhecido" + token/rss: + add_button: "Token RSS" + blank_description: "Ainda não existe um token RSS. Pode criar um no botão abaixo." + blank_title: "Nenhum token RSS" title: "RSS" + table_title: "Tokens RSS" text_hint: "Os tokens RSS permitem aos utilizadores manterem-se a par das últimas alterações nesta instância do OpenProject através de um leitor RSS externo." static_token_name: "Token RSS" disabled_text: "Os tokens RSS não são ativados pelo administrador. Contacte o seu administrador para utilizar esta funcionalidade." storages: - title: "Armazenamentos de ficheiros" - text_hint: "Os tokens de armazenamento de ficheiros ligam esta instância do OpenProject a um armazenamento de ficheiros externo." - empty_text_hint: "Não existe um acesso ao armazenamento associado à sua conta." - revoke_token: "Tem a certeza de que deseja remover este token? Terá de iniciar sessão novamente em %{storage}" - removed: "Token de armazenamento de ficheiros removido com sucesso" - failed: "Ocorreu um erro e não foi possível remover o token. Tente novamente mais tarde." unknown_storage: "Armazenamento desconhecido" notifications: reasons: @@ -2995,6 +3064,7 @@ pt-PT: label_always_visible: "Sempre exibido" label_announcement: "Aviso" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "Chave de acesso API criada há %{value}" label_api_access_key_type: "API" @@ -3250,6 +3320,7 @@ pt-PT: label_journal_diff: "Comparação de descrição" label_language: "Idioma" label_languages: "Idiomas" + label_external_links: "Links externos" label_locale: "Idioma e região" label_jump_to_a_project: "Saltar para um projeto..." label_keyword_plural: "Palavras-chave" @@ -3427,9 +3498,6 @@ pt-PT: label_project_hierarchy: "Hierarquia do projeto" label_project_mappings: "Projetos" label_project_new: "Novo Projecto" - label_project_initiation_request: "Pedido de início de novo projeto" - label_project_creation_wizard: "Assistente para criação de novos projetos" - label_project_mandate: "Mandato para novo projeto" label_project_plural: "Projetos" label_project_list_plural: "Listas do projeto" label_project_life_cycle: "Ciclo de vida do projeto" @@ -3892,7 +3960,7 @@ pt-PT: notice_not_authorized: "Não está autorizado a aceder a esta página." notice_not_authorized_archived_project: "O projeto ao qual tentou aceder foi arquivado." notice_requires_enterprise_token: "O token da empresa está em falta ou não permite o acesso a esta página." - notice_password_confirmation_failed: "A sua palavra passe está incorreta. Não foi possível continuar." + notice_password_confirmation_failed: "A palavra-passe introduzida não está correta." notice_principals_found_multiple: "Foram encontrados %{number} resultados. Carregue em TAB para ver o primeiro resultado." notice_principals_found_single: "Foi encontrado um resultado. Carregue em TAB para vê-lo." notice_parent_item_not_found: "O elemento pai não foi encontrado." @@ -4243,6 +4311,9 @@ pt-PT: setting_allowed_link_protocols: "Protocolos de ligação permitidos" setting_allowed_link_protocols_text_html: >- Permitir que estes protocolos sejam apresentados como ligações nas descrições do pacote de trabalho, campos de texto longos e comentários. Por exemplo, %{tel_code} ou %{element_code}. Introduza um protocolo por linha.
    Protocolos %{http_code}, %{https_code} e %{mailto_code} são sempre permitidos. + setting_capture_external_links: "Capturar links externos" + setting_capture_external_links_text: > + Quando ativada, todos os links externos no texto formatado serão redirecionados através de uma página de aviso antes de sair da aplicação. Isto ajuda a proteger os utilizadores de sites externos potencialmente maliciosos. setting_after_first_login_redirect_url: "Redirecionamento do primeiro início de sessão" setting_after_first_login_redirect_url_text_html: > Defina um caminho para redirecionar os utilizadores após o primeiro início de sessão. Se estiver vazio, redireciona para a página inicial do tour de integração.
    Exemplo: /my/page @@ -4255,11 +4326,17 @@ pt-PT: setting_apiv3_cors_origins_text_html: > Se o CORS estiver habilitado, estas são as origens que têm permissão para aceder ao API OpenProject.
    Por favor, verifique a documentação no cabeçalho da Origem sobre como especificar os valores esperados. setting_apiv3_write_readonly_attributes: "Acesso de escrita a atributos só de leitura" - setting_apiv3_write_readonly_attributes_instructions_html: > - Se estiver ativada, a API irá permitir que os administradores escrevam atributos estáticos só de leitura durante a criação, como createdAt e autor.
    Aviso: esta definição tem um caso de utilização para, por exemplo, importar dados, mas permite que os administradores se façam passar por outros utilizadores na criação de itens. No entanto, todos os pedidos de criação são registados com o verdadeiro autor.
    Para obter mais informações sobre os atributos e os recursos suportados, consulte a %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Se ativada, a API permitirá que os administradores escrevam atributos estáticos só de leitura durante a criação, tais como createdAt e author. + setting_apiv3_write_readonly_attributes_warning: > + Esta definição tem um caso de utilização para, por exemplo, importar dados, mas permite que os administradores se façam passar por outros utilizadores na criação de elementos. No entanto, todos os pedidos de criação são registados com o verdadeiro autor. + setting_apiv3_write_readonly_attributes_additional: > + Para mais informações sobre atributos e recursos suportados, consulte %{api_documentation_link}. setting_apiv3_max_page_size: "Tamanho máximo da página de API" - setting_apiv3_max_page_instructions_html: > - Defina o tamanho máximo de página com a qual a API vai responder. Não será possível fazer solicitações de API que retornem mais valores numa única página.
    Aviso: Altere este valor apenas se tiver certeza do motivo pelo qual precisa de o fazer. Definir um valor alto resulta em impactos significativos no desempenho, enquanto um valor menor que as opções por página causa erros nas visualizações paginadas. + setting_apiv3_max_page_size_instructions: > + Defina o tamanho máximo da página com que a API responderá. Não será possível executar pedidos de API que devolvam mais valores numa única página. + setting_apiv3_max_page_size_warning: > + Só altere este valor se tiver a certeza de que é necessário. Definir um valor elevado terá um impacto significativo no desempenho, enquanto um valor inferior ao número de elementos por página provocará erros nas visualizações paginadas. setting_apiv3_docs: "Documentação" setting_apiv3_docs_enabled: "Ativar página de documentos" setting_apiv3_docs_enabled_instructions_html: > @@ -4444,7 +4521,7 @@ pt-PT: omniauth_direct_login_hint_html: > Se esta opção estiver ativa, os pedidos de início de sessão serão redirecionados para o fornecedor omniauth configurado. O menu pendente de início de sessão e a página de início de sessão serão desativados.
    Nota: a menos que também desative os inícios de sessão com palavra-passe, com esta opção ativada, os utilizadores ainda podem iniciar sessão internamente ao visitar a página de início de sessão %{internal_path}. remapping_existing_users_hint: > - Se ativado, permite que qualquer provedor de identidade configurado faça o início de sessão de utilizadores existentes com base em seu endereço de e-mail, mesmo que o utilizador nunca tenha iniciado sessão através desse provedor. Pode ser útil ao migrar a instância do OpenProject para um novo provedor SSO, mas não é recomendado ao usar um provedor que não seja fiável para todos os utilizadores da sua instância. + Quando ativada, esta opção permite que qualquer fornecedor de identidade configurado inicie a sessão de utilizadores existentes com base no respetivo nome de utilizador, mesmo que estes nunca tenham iniciado sessão através desse fornecedor anteriormente. Isto pode ser útil ao migrar a instância do OpenProject para um novo fornecedor de SSO, mas não é recomendado quando se utiliza um fornecedor que não seja de confiança para todos os utilizadores da instância. attachments: whitelist_text_html: > Defina uma lista de extensões de ficheiros e/ou de tipos mime para ficheiros carregados.
    Insira extensões de ficheiro (por exemplo, %{ext_example}) ou tipos mime (ex., %{mime_example}).
    Deixe em branco para permitir que qualquer tipo de ficheiro seja carregado. Vários valores permitidos (uma linha para cada valor). @@ -4718,6 +4795,7 @@ pt-PT: Nota: se ativo, irá mostrar um emblema com o estado da sua instalação no painel de administração %{information_panel_label} e na página inicial. Só é mostrado a administradores.
    O emblema verificará a sua versão atual do OpenProject em relação à base de dados oficial da versão do OpenProject para o alertar sobre quaisquer atualizações ou vulnerabilidades conhecidas. Para obter mais informações sobre o que a verificação fornece, quais os dados que são necessários para fornecer atualizações disponíveis e como desativar esta verificação, visite the configuration documentation. text_own_membership_delete_confirmation: "Está prestes a eliminar parcial ou totalmente as suas permissões. É possível que não possa editar o projeto após esta acção.\nTem a certeza de que deseja continuar?" text_permanent_delete_confirmation_checkbox_label: "Compreendo que esta eliminação não pode ser anulada" + text_permanent_remove_confirmation_checkbox_label: "Compreendo que esta remoção não pode ser anulada" text_plugin_assets_writable: "É possíver escrever na pasta de ativos dos módulos de extensão" text_powered_by: "Desenvolvido por %{link}" text_project_identifier_info: "Apenas letras minúsculas (a-z), números, traços e underscores são permitidos, deve começar com uma letra minúscula." @@ -4808,8 +4886,8 @@ pt-PT: other: "bloqueada temporariamente (%{count} tentativas de início de sessão falhadas)" confirm_status_change: "Está prestes a mudar o estado de '%{name}'. Tem certeza que deseja continuar?" deleted: "Eliminar Utilizador" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Não é possível alterar o seu próprio estado de utilizador." + error_admin_change_on_non_admin: "Só os administradores podem alterar o estado dos utilizadores administradores." error_status_change_failed: "A alteração do estado do utilizador falhou devido aos seguintes erros: %{errors}" invite: Convidar utilizador via email invited: convidado @@ -5214,3 +5292,8 @@ pt-PT: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Sair do OpenProject" + warning_message: "Está prestes a sair do OpenProject e a visitar um site externo. Tenha em atenção que os sites externos não estão sob o nosso controlo, e podem ter políticas de privacidade e de segurança diferentes." + continue_message: "Tem a certeza de que quer aceder à seguinte ligação externa?" + continue_button: "Continuar para o site externo" diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index 77c240524d2..fea351aaa2e 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -109,6 +109,23 @@ ro: explanation: text: "Acțiunile individuale ale unui utilizator (de exemplu, actualizarea de două ori a unui pachet de lucru) sunt agregate într-o singură acțiune dacă diferența de vechime dintre ele este mai mică decât intervalul de timp specificat. Acestea vor fi afișate ca o singură acțiune în cadrul aplicației. De asemenea, acest lucru va întârzia notificările cu aceeași perioadă de timp, reducând numărul de e-mailuri trimise și va afecta, de asemenea, întârzierea %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -592,6 +609,7 @@ ro: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: În acest moment nu există tipuri disponibile. form: @@ -606,6 +624,9 @@ ro: work_package_priorities: new_label: "Prioritate nouă" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,6 +640,7 @@ ro: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -720,9 +742,11 @@ ro: create_button: "Creează" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Resetarea tokenului de acces nu a reușit: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -732,6 +756,9 @@ ro: notice_api_token_revoked: "Token-ul API a fost șters. Pentru a crea un nou token, foloște butonul din secțiunea API." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: În acest moment nu există știri de raportat. @@ -1240,6 +1267,10 @@ ro: onthefly: "Crearea automată a utilizatorilor" port: "Port" tls_certificate_string: "Certificat SSL pentru serverul LDAP" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roluri" notification: @@ -1498,6 +1529,7 @@ ro: even: "trebuie să fie par." exclusion: "este rezervat." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "este prea mare (dimensiunea maximă este %{count} Octeți)." filter_does_not_exist: "filtrul nu există." format: "nu se potrivește cu formatul așteptat '%{expected}'." @@ -1520,7 +1552,8 @@ ro: not_a_datetime: "nu este o dată-ora validă." not_a_number: "nu este un număr." not_allowed: "nu este valabilă din cauza lipsei de permisiuni." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "nu este un întreg." not_an_iso_date: "nu este o dată validă. Formatul necesar: AAAA-MM-ZZ." not_same_project: "nu aparține aceluiași proiect." @@ -1941,7 +1974,14 @@ ro: one: Token acces few: Token-uri de acces other: Token-uri de acces - type: "Tip" + token/rss: + one: "RSS token" + few: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + other: "Types" user: "Utilizator" version: "Versiune" workflow: "Flux de lucru" @@ -2162,6 +2202,7 @@ ro: button_click_to_reveal: "Clic pentru a dezvălui" button_close: "Închide" button_collapse_all: "Restrângere totală" + button_confirm: "Confirm" button_configure: "Configurare" button_continue: "Continuă" button_complete: "Finalizează" @@ -2194,6 +2235,7 @@ ro: button_print: "Tipărește" button_quote: "Citare" button_remove: Eliminare + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Redenumește" button_replace: "Înlocuiește" @@ -2465,7 +2507,7 @@ ro: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Evidențiere condiționată + capture_external_links: Capture External Links internal_comments: Comentarii interne custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2475,10 +2517,12 @@ ro: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2519,8 +2563,8 @@ ro: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Creează și organizează diferite faze de proiect decât cele furnizate de planificarea ciclului proiectului PM2." - conditional_highlighting: - description: "Ai nevoie de anumite pachete de lucru pentru a ieși în evidență? Utilizează evidențierea condiționată în tabelul pachetelor de lucru." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2550,6 +2594,8 @@ ro: custom_actions: title: "Acțiuni personalizate" description: "Acțiunile personalizate sunt comenzi rapide cu un singur clic către un set de acțiuni predefinite pe care le puteți face disponibile pentru anumite pachete de lucru în funcție de statut, rol, tip sau proiect." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2561,6 +2607,8 @@ ro: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Utilizatori Placeholder description: > @@ -2859,19 +2907,17 @@ ro: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Actualizează la ediția Enterprise" postgres_migration: "Migrarea instalației dvs. către PostgreSQL" @@ -2939,14 +2985,17 @@ ro: instructions_after_error: "Poţi încerca să te autentifici din nou dând click pe %{signin}. Dacă eroarea persistă, cere ajutorul administratorului." menus: admin: - mail_notification: "Notificări prin e-mail" - mails_and_notifications: "E-mailuri și notificări" + ai: "Artificial Intelligence (AI)" aggregation: "Agregare" api_and_webhooks: "API și webhook-uri" + mail_notification: "Notificări prin e-mail" + mails_and_notifications: "E-mailuri și notificări" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Nu există tichete de acces de afișat" description: "Toate au fost dezactivate. Pot fi reactivate în meniul de administrare." @@ -2956,34 +3005,56 @@ ro: expiration: "Expirare" indefinite_expiration: "Niciodată" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Stocuri de fișiere" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3045,6 +3116,7 @@ ro: label_always_visible: "Afișat permanent" label_announcement: "Anunţ" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Cheie de acces API" label_api_access_key_created_on: "Cheia de acces creată acum %{value}" label_api_access_key_type: "API" @@ -3300,6 +3372,7 @@ ro: label_journal_diff: "Comparare descriere" label_language: "Limbă" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Salt la un proiect..." label_keyword_plural: "Cuvinte cheie" @@ -3477,9 +3550,6 @@ ro: label_project_hierarchy: "Ierarhie de proiecte" label_project_mappings: "Proiecte" label_project_new: "Proiect nou" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Proiecte" label_project_list_plural: "Listă proiecte" label_project_life_cycle: "Ciclul de viață proiect" @@ -3943,7 +4013,7 @@ ro: notice_not_authorized: "Nu sunteți autorizat să accesați această pagină." notice_not_authorized_archived_project: "Proiectul pe care încercați să îl accesați a fost arhivat." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Parola dvs. nu este corectă. Nu se poate continua." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "S-au găsit %{number} rezultate\n Tab pentru a se concentra pe primul rezultat." notice_principals_found_single: "Există un singur rezultat\n Tab pentru a-l concentra." notice_parent_item_not_found: "Parent item not found." @@ -4297,6 +4367,9 @@ ro: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4309,11 +4382,17 @@ ro: setting_apiv3_cors_origins_text_html: > Dacă CORS este activat, acestea sunt originile cărora li se permite accesul la OpenProject API.
    Vă rugăm să consultați documentația privind antetul Origin pentru a specifica valorile așteptate. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Dimensiunea maximă a paginii API" - setting_apiv3_max_page_instructions_html: > - Seteză dimensiunea maximă a paginii cu care API-ul va răspunde. Nu va fi posibil să efectuzi cereri API care returnează mai multe valori pe o singură pagină.
    Avertisment: Te rog să schimbi această valoare numai dacă ești sigur de ce ai nevoie. Stabilirea unei valori ridicate va avea ca rezultat un impact semnificativ asupra performanței; în timp ce o valoare mai mică decât opţiunile per pagină va cauza erori în vizualizările paginate. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentație" setting_apiv3_docs_enabled: "Activare pagină documente" setting_apiv3_docs_enabled_instructions_html: > @@ -4498,7 +4577,7 @@ ro: omniauth_direct_login_hint_html: > Dacă această opțiune este activă, cererile de conectare vor fi redirecționate către furnizorul omniauth configurat. Pagina de autentificare verticală și pagina de autentificare vor fi dezactivate.
    Notă: Dacă nu dezactivezi și autentificarea cu parole, cu această opțiune activată, utilizatorii încă se pot autentifica intern vizitând pagina de autentificare %{internal_path}. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Definește o listă validă de extensii de fișiere și/sau tipuri mime pentru fișierele încărcate.
    Introdu extensii de fișiere (de ex. %{ext_example}) sau tipuri mime (e. ., %{mime_example}).
    Lasă gol pentru a permite oricărui tip de fișier să fie încărcat. Valori multiple permise (o linie pentru fiecare valoare). @@ -4604,7 +4683,7 @@ ro: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4772,6 +4851,7 @@ ro: Notă: dacă este activată, aceasta va afișa o insignă cu starea instalării în fereastra %{information_panel_label} panoul de administrare și pe pagina principală. Aceasta este afișată numai pentru administratori.
    Insigna va verifica versiunea curentă a OpenProject în raport cu baza de date oficială a versiunilor OpenProject pentru a alerta cu privire la orice actualizări sau vulnerabilități cunoscute. Pentru mai multe informații despre ce oferă verificarea, ce date sunt necesare pentru a furniza actualizările disponibile și cum să dezactivezi această verificare, te rog să vizitezi documentația de configurare. text_own_membership_delete_confirmation: "Sunteţi cale de a elimina unele sau toate permisiunile şi e posibil să nu mai puteți edita acest proiect după aceea. \nSunteţi sigur că doriţi să continuaţi?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Se poate scrie în directorul de resurse pentru module" text_powered_by: "Propulsat de %{link}" text_project_identifier_info: "Doar litere mici (a-z), numere, cratime şi linii de subliniere sunt permise, trebuie să înceapă cu o literă mică." @@ -5270,3 +5350,8 @@ ro: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index d5ed5345682..64f9e8cdbfc 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -109,6 +109,23 @@ ru: explanation: text: "Личные действия пользователя (например, обновление пакета работ дважды) агрегируются в одно действие, если их разница во времени не больше указанной. Они будут отображаться как одно действие внутри приложения. Это также задерживает уведомление на такое же количество времени, уменьшая количество отправляемых писем и также повлияет на %{webhook_link} задержки." link: "вебхук" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT от поставщика идентификации" @@ -592,6 +609,7 @@ ru: is_for_all_blank_slate: heading: Для всех проектов description: Этот атрибут проекта включен во всех проектах, поскольку опция "Для всех проектов" отмечена. Его нельзя отключить для отдельных проектов. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: На данный момент доступных типов нет. form: @@ -606,6 +624,9 @@ ru: work_package_priorities: new_label: "Новый приоритет" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "Созданный артефакт будет сохранен в виде PDF-вложения к пакету работ." description_file_link_export: "Пакет работ будет содержать ссылку на файл PDF, хранящийся во внешнем файловом хранилище. Требуется рабочее файловое хранилище с автоматически управляемыми папками для данного проекта. На данный момент поддерживаются только файловые хранилища Nextcloud." @@ -619,6 +640,7 @@ ru: label_request_submission: "Подача заявки" project_attributes_description: > Выберите, какие атрибуты проекта должны быть включены в запрос на инициацию проекта. В этот список входят только [атрибуты проекта](project_attributes_url), включенные для этого проекта. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Редактировать статус wizard: @@ -726,9 +748,11 @@ ru: create_button: "Создать" name_label: "Название токена" created_dialog: + one_time_warning: "Это единственный раз, когда Вы увидите токен. Убедитесь, что вы сохранили его." token/api: title: "Токен доступа к API сгенерирован" - warning: "Это единственный раз, когда Вы увидите токен. Убедитесь, что вы сохранили его." + token/rss: + title: "Токен RSS сгенерирован" failed_to_reset_token: "Не удалось сбросить маркер доступа: %{error}" failed_to_create_token: "Не удалось создать токен доступа: %{error}" failed_to_revoke_token: "Не удалось отозвать токен доступа: %{error}" @@ -738,6 +762,9 @@ ru: notice_api_token_revoked: "API токен был удален. Чтобы создать новый токен, пожалуйста, используйте кнопку в разделе API." notice_rss_token_revoked: "Ключ RSS был удален. Чтобы создать новый токен, пожалуйста, используйте ссылку в разделе RSS." notice_ical_token_revoked: 'токен iCalendar "%{token_name}" для календаря "%{calendar_name}" проекта "%{project_name}" был отозван. URL-адрес iCalendar с этим токеном недействителен.' + password_confirmation_dialog: + confirmation_required: "Чтобы подтвердить изменения, введите пароль учетной записи." + title: "Подтвердите свой пароль, чтобы продолжить" news: index: no_results_title_text: На данный момент новостей для отчета нет. @@ -1247,6 +1274,10 @@ ru: onthefly: "Автоматическое создание пользователя" port: "Порт" tls_certificate_string: "SSL-сертификат сервера LDAP" + mcp_configuration: + enabled: Включено + title: Название + description: Описание member: roles: "Роль" notification: @@ -1505,6 +1536,7 @@ ru: even: "должно быть чётным." exclusion: "зарезервировано." feature_disabled: недоступно. + feature_disabled_for_project: отключен для этого проекта. file_too_large: "слишком большой (максимальный размер составляет %{count} байт)." filter_does_not_exist: "фильтр не существует." format: "не соответствует ожидаемому формату '%{expected}'." @@ -1527,7 +1559,8 @@ ru: not_a_datetime: "дата и время не являются допустимыми." not_a_number: "не является числом." not_allowed: "неверно, ввиду отсутствия прав." - not_json: "не является допустимым объектом JSON." + not_json: "не может быть разобран как JSON." + not_json_object: "не является объектом JSON." not_an_integer: "не является целым числом." not_an_iso_date: "недопустимая дата. Требуемый формат: гггг-мм-дд." not_same_project: "не принадлежит тому же проекту." @@ -1961,7 +1994,16 @@ ru: few: Маркеры доступа many: Маркеры доступа other: Маркеры доступа - type: "Тип" + token/rss: + one: "Токен RSS" + few: "RSS tokens" + many: "RSS tokens" + other: "Токены RSS" + type: + one: "Тип" + few: "Типа" + many: "Типов" + other: "Типов" user: "Пользователь" version: "Этапы" workflow: "Рабочий поток" @@ -2186,6 +2228,7 @@ ru: button_click_to_reveal: "Нажмите, чтобы раскрыть" button_close: "Закрыть" button_collapse_all: "Свернуть все" + button_confirm: "Подтвердить" button_configure: "Настройка" button_continue: "Продолжить" button_complete: "Готово" @@ -2218,6 +2261,7 @@ ru: button_print: "Печать" button_quote: "Цитата" button_remove: Удалить + button_remove_permanently: "Удалить навсегда" button_remove_reminder: "Удалить напоминание" button_rename: "Переименовать" button_replace: "Заменить" @@ -2509,7 +2553,7 @@ ru: baseline_comparison: Сравнение базовых уровней board_view: Расширенные доски calculated_values: Рассчитываемые значения - conditional_highlighting: Условное выделение + capture_external_links: Перехват внешних ссылок internal_comments: Служебный комментарий custom_actions: Пользовательские действия custom_field_hierarchies: Иерархии @@ -2519,10 +2563,12 @@ ru: edit_attribute_groups: Редактирование атрибутов групп gantt_pdf_export: Экспорт диаграммы Ганта в PDF ldap_groups: Синхронизация пользователей LDAP и групп + mcp_server: MCP-сервер nextcloud_sso: Единый вход для Nextcloud хранения one_drive_sharepoint_file_storage: Файловое хранилище OneDrive/SharePoint placeholder_users: Пользователи-заполнители portfolio_management: Управление портфолио + project_creation_wizard: Project initiation request project_list_sharing: Совместное использование списка проектов readonly_work_packages: Пакеты работ только для чтения scim_api: API сервера SCIM @@ -2563,8 +2609,8 @@ ru: description: "Создать автоматически генерируемые темы, используя атрибуты и текст." customize_life_cycle: description: "Создание и организация этапов и стадий проекта, отличных от тех, что предусмотрены планированием цикла проекта PM2." - conditional_highlighting: - description: "Нужно ли выделять определённые пакеты работ из общего списка? Используйте условное выделение в таблице пакетов работ." + capture_external_links: + description: "Предотвращать атаки социальной инженерии путем перехвата внешних ссылок до того, как пользователи их посетят." work_package_query_relation_columns: description: "Нужно видеть отношения или дочерние элементы в списке пакетов работ?" edit_attribute_groups: @@ -2594,6 +2640,8 @@ ru: custom_actions: title: "Пользовательские действия" description: "Пользовательские действия являются ярлыками к набору заранее определенных действий, которые вы можете сделать доступными для определенных пакетов работ на основе статуса, роли, типа или проекта." + mcp_server: + description: "Интегрируйте агентов искусственного интеллекта в Ваш OpenProject с помощью MCP." nextcloud_sso: title: "Единый вход для Nextcloud хранения" description: "Включите бесшовную и безопасную аутентификацию для вашего Nextcloud хранилища с помощью Single Sign-On. Упростите управление доступом и сделайте удобным для пользователя." @@ -2605,6 +2653,8 @@ ru: description: "Разрешить пользователям входить через внешние SSO провайдеры, используя SAML или OpenID Connect для бесшовного доступа и интеграции с существующими идентификационными системами." virus_scanning: description: "Будьте уверены в том, что загруженные в OpenProject файлы проверены на наличие вирусов, прежде чем они станут доступны другим пользователям." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Пользователи-заполнители description: > @@ -2904,19 +2954,17 @@ ru: learn_about: "Узнайте больше о всех новых функциях" missing: "Нет выделенных функций." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > Релиз содержит различные новые функции и улучшения, такие как: new_features_list: - line_0: Совместная работа с документами в режиме реального времени. - line_1: Возможность структурировать связанные проекты в программы и портфели, чтобы направить их на достижение стратегических целей. - line_2: Улучшенное управление совещаниями с режимом черновика, режимом презентации, улучшенными результатами и подпиской на iCal. - line_3: Обновленная интеграция с SharePoint с более строгими разрешениями. - line_4: Переработанный обзор проекта с новыми вкладками, настраиваемыми виджетами и улучшенным макетом. - line_5: Возможность более строго охранять конфиденциальность пользователей, не работающих в одном проекте. - line_6: Улучшенный процесс создания проекта с более удобным выбором шаблона. - line_7: Более удобный глобальный поиск, включая тип и статус, улучшение точности нескольких автозаполнений. - line_8: Улучшена доступность текстов ALT и улучшены цвета графиков. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Совещания: добавление новых или существующих пакетов работ в качестве итогов совещания." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Повторяющиеся совещания: продублируйте пункты повестки дня на следующее совещание." + line_4: "Выпуск для сообщества: Выделение атрибутов." + line_5: Предупреждение перед открытием внешних ссылок в содержании, предоставленном пользователем (Enterprise add-on). + line_6: Улучшена производительность и пользовательский опыт, включая вкладку "Деятельность" и модуль "Документы". links: upgrade_enterprise_edition: "Обновить до корпоративной версии" postgres_migration: "Перенос вашей установки в PostgreSQL" @@ -2984,14 +3032,17 @@ ru: instructions_after_error: "Вы можете попробовать войти снова, нажав %{signin}. Если ошибка повторится, обратитесь к вашему администратору за помощью." menus: admin: - mail_notification: "Уведомления по электронной почте" - mails_and_notifications: "Письма и уведомления" + ai: "Искусственный интеллект (AI)" aggregation: "Агрегация" api_and_webhooks: "API и вебхуки" + mail_notification: "Уведомления по электронной почте" + mails_and_notifications: "Письма и уведомления" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Добавить…" my_account: access_tokens: + description: "Провайдерские токены выпускаются OpenProject, позволяя другим приложениям получать к ним доступ. Клиентские токены выпускаются другими приложениями, позволяя OpenProject получить к ним доступ." no_results: title: "Нет маркеров доступа для отображения" description: "Все они были отключены. Они могут быть включены вновь в меню Администрирование." @@ -3001,34 +3052,56 @@ ru: expiration: "Срок действия" indefinite_expiration: "Никогда" simple_revoke_confirmation: "Вы уверены, что хотите отменить этот токен?" + tabs: + client: + title: "Клиентские токены" + provider: + title: "Провайдерские токены" token/api: + blank_description: "Токен API еще не создан. Вы можете создать его с помощью кнопки ниже." + blank_title: "Нет токена API" title: "API" + table_title: "Токены API" text_hint: "Токены API позволяют приложениям общаться с этим экземпляром OpenProject через REST API." + static_token_name: "Токен API" disabled_text: "Токены API не включены администратором. Пожалуйста, обратитесь к администратору для использования этой функции." - add_button: "API токен" - api: - static_token_name: "API-токен" + add_button: "API-токен" ical: + blank_description: "Чтобы добавить токен iCalendar, подпишитесь на новый или существующий календарь из модуля календаря проекта. Вы должны иметь необходимые разрешения." + blank_title: "Нет токена iCalendar" title: "iCalendar" + table_title: "Токены iCalendar" text_hint_link: "Токены iCalendar позволяют пользователям [подписываться на календари OpenProject](docs_url) и просматривать актуальную информацию о пакетах работ во внешних клиентах." disabled_text: "Подписки на iCalendar не включены администратором. Обратитесь к администратору для использования этой функции." - empty_text_hint: "Чтобы добавить токен iCalendar, подпишитесь на новый или существующий календарь из модуля календаря проекта. Вы должны иметь необходимые разрешения." - oauth: + oauth_application: + active_tokens: "Активные токены" + blank_description: "Для Вас не будет настроен и активен доступ к сторонним приложениям." + blank_title: "Нет токена приложения OAuth" + last_used_at: "Последний раз использовался в" title: "OAuth" - text_hint: "Токены OAuth позволяют сторонним приложениям подключаться к этому экземпляру OpenProject." - empty_text_hint: "Для вас не настроен и не активирован доступ к сторонним приложениям. Пожалуйста, свяжитесь с вашим администратором, чтобы активировать эту функцию." - rss: + table_title: "Токены приложения OAuth" + text_hint: "Токены приложений OAuth позволяют сторонним приложениям подключаться к данному экземпляру OpenProject." + oauth_client: + blank_description: "Клиентских токенов OAuth пока не существует." + blank_title: "Нет клиентских токенов OAuth" + failed: "Произошла ошибка, и токен не удалось удалить. Пожалуйста, повторите попытку позже." + integration_type: "Тип интеграции" + table_title: "Клиентские токены OAuth" + text_hint: "Клиентские токены OAuth позволяют данному экземпляру OpenProject соединяться с внешними приложениями, например, с файловыми хранилищами." + title: "OAuth" + remove_token: "Вы действительно хотите удалить этот токен? Вам нужно будет снова войти в систему %{integration}." + removed: "Токен OAuth успешно удален" + unknown_integration: "Неизвестная" + token/rss: + add_button: "Токен RSS" + blank_description: "Токен RSS пока не создан. Вы можете создать его с помощью кнопки ниже." + blank_title: "Нет токена RSS" title: "RSS" + table_title: "Токены RSS" text_hint: "Токены RSS позволяют пользователям следить за последними изменениями в этом экземпляре OpenProject через внешний RSS-трекер." static_token_name: "Токен RSS" disabled_text: "Токены RSS не включены администратором. Пожалуйста, обратитесь к администратору, чтобы использовать эту функцию." storages: - title: "Файловые хранилища" - text_hint: "Токены хранения файлов подключают этот экземпляр OpenProject к внешнему хранилищу файлов." - empty_text_hint: "Нет доступа к хранилищу, связанному с вашей учетной записью." - revoke_token: "Вы действительно хотите удалить этот токен? Вам нужно будет снова войти в систему на %{storage}" - removed: "Токен хранилища файлов успешно удален" - failed: "Произошла ошибка, и токен не удалось удалить. Пожалуйста, повторите попытку позже." unknown_storage: "Неизвестное хранилище" notifications: reasons: @@ -3090,6 +3163,7 @@ ru: label_always_visible: "Всегда отображается" label_announcement: "Объявление" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Ключ доступа к API" label_api_access_key_created_on: "Ключ доступа к API, созданный %{value} назад" label_api_access_key_type: "API" @@ -3345,6 +3419,7 @@ ru: label_journal_diff: "Описание сравнения" label_language: "Язык" label_languages: "Языки" + label_external_links: "Внешние ссылки" label_locale: "Язык и регион" label_jump_to_a_project: "Перейти к проекту..." label_keyword_plural: "Ключевые слова" @@ -3522,9 +3597,6 @@ ru: label_project_hierarchy: "Иерархия проектов" label_project_mappings: "Проекты" label_project_new: "Новый проект" - label_project_initiation_request: "Запрос на инициирование нового проекта" - label_project_creation_wizard: "Мастер создания нового проекта" - label_project_mandate: "Новый мандат проекта" label_project_plural: "Проекты" label_project_list_plural: "Списки проектов" label_project_life_cycle: "Жизненный цикл проекта" @@ -3989,7 +4061,7 @@ ru: notice_not_authorized: "Вы не авторизованы для доступа к этой странице." notice_not_authorized_archived_project: "Проект, к которому Вы пытаетесь получить доступ, заархивирован." notice_requires_enterprise_token: "Токен Enterprise отсутствует или не разрешает доступ к этой странице." - notice_password_confirmation_failed: "Пароль не правильный. Продолжить нельзя." + notice_password_confirmation_failed: "Введенный пароль неверен." notice_principals_found_multiple: "Найдено %{number} результатов. Нажмите для перехода к первому." notice_principals_found_single: "Найден один результат. Нажмите для перехода к нему." notice_parent_item_not_found: "Родительский элемент не найден." @@ -4342,6 +4414,9 @@ ru: setting_allowed_link_protocols: "Разрешить ссылки на протоколы" setting_allowed_link_protocols_text_html: >- Разрешить отображать эти протоколы как ссылки в описаниях пакетов работ, длинных текстовых полях и комментариях. Например, %{tel_code} или %{element_code}. Введите по одному протоколу в строке.
    Протоколы %{http_code}, %{https_code} и %{mailto_code} всегда разрешены. + setting_capture_external_links: "Перехват внешних ссылок" + setting_capture_external_links_text: > + Если эта функция включена, все внешние ссылки в форматированном тексте будут перенаправляться через страницу предупреждения, прежде чем покинуть приложение. Это помогает защитить пользователей от потенциально вредоносных внешних сайтов. setting_after_first_login_redirect_url: "Перенаправление первого входа" setting_after_first_login_redirect_url_text_html: > Задайте путь для перенаправления пользователей после их первого входа в систему. Если не задано, то пользователь будет перенаправлен на домашнюю страницу обзорного тура.
    Например: /my/page @@ -4354,11 +4429,17 @@ ru: setting_apiv3_cors_origins_text_html: > Если CORS включен, то это источники, которым разрешен доступ к OpenProject API.
    Пожалуйста, проверьте документацию по происхождению о том, как указывать ожидаемые значения. setting_apiv3_write_readonly_attributes: "Доступ на запись к атрибутам, доступным только для чтения" - setting_apiv3_write_readonly_attributes_instructions_html: > - Если этот параметр включен, API позволит администраторам записывать во время создания статические атрибуты, доступные только для чтения, такие как «Создано в» и «Автор».
    Внимание! Этот параметр можно использовать, например, для импорта данных, но он позволяет администраторам выдавать себя при создании элементов за других пользователей. Однако все запросы на создание регистрируются с указанием истинного автора.
    Для получения дополнительной информации об атрибутах и ​​поддерживаемых ресурсах см. %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Если эта опция включена, API позволит администраторам записывать статические атрибуты, доступные только для чтения, во время создания, такие как createdAt и author. + setting_apiv3_write_readonly_attributes_warning: > + Эта настройка используется, например, для импорта данных, но позволяет администраторам выдавать себя за других пользователей при создании элементов. Однако все запросы на создание регистрируются с указанием истинного автора. + setting_apiv3_write_readonly_attributes_additional: > + Более подробную информацию об атрибутах и поддерживаемых ресурсах см. на сайте %{api_documentation_link}. setting_apiv3_max_page_size: "Максимальный размер страницы API" - setting_apiv3_max_page_instructions_html: > - Установите максимальный размер страницы, который будет отвечать API. Невозможно выполнить API-запросы, возвращающие много значений на одной странице.
    Предупреждение: Пожалуйста, измените это значение, только если вы уверены, зачем вам это нужно. Установка большого значения приведет к значительному снижению производительности, в то время как значение ниже, чем для параметров страницы, вызовет ошибки в представлениях с разбивкой на страницы. + setting_apiv3_max_page_size_instructions: > + Установите максимальный размер страницы, на которую будет отвечать API. Запросы API, возвращающие больше значений на одной странице, выполнить будет невозможно. + setting_apiv3_max_page_size_warning: > + Пожалуйста, изменяйте это значение только в том случае, если Вы уверены, зачем оно Вам нужно. Установка большого значения приведет к значительному снижению производительности, в то время как значение, меньшее, чем опции для каждой страницы, приведет к ошибкам при постраничном просмотре. setting_apiv3_docs: "Документация" setting_apiv3_docs_enabled: "Включить страницу с документами" setting_apiv3_docs_enabled_instructions_html: > @@ -4543,7 +4624,7 @@ ru: omniauth_direct_login_hint_html: > Если эта опция включена, запросы на вход в систему будут перенаправлены на настроенный провайдер omniauth. Выпадающий список входа и страница входа будут отключены.
    Примечание: Если вы также не отключите вход по паролю, то пользователи все еще могут войти внутри системы, посетив страницу входа %{internal_path}. remapping_existing_users_hint: > - Если эта опция включена, она позволяет любому сконфигурированному провайдеру идентификации регистрировать существующих пользователей на основе их адреса электронной почты, даже если пользователь никогда раньше не регистрировался через этого провайдера. Это может быть полезно при переносе OpenProject на нового провайдера SSO, но не рекомендуется при использовании провайдера, которому не доверяют все пользователи OpenProject. + Если эта опция включена, она позволяет любому сконфигурированному провайдеру идентификации регистрировать существующих пользователей на основе их имени пользователя, даже если пользователь никогда раньше не входил в систему через этого провайдера. Это может быть полезно при переносе экземпляра OpenProject на нового провайдера SSO, но не рекомендуется при использовании провайдера, которому не доверяют все пользователи Вашего экземпляра. attachments: whitelist_text_html: > Определите список допустимых расширений файлов и/или mime типов для загруженных файлов.
    Введите расширения файлов (например, %{ext_example}) или mime типы (e. ., %{mime_example}).
    Оставьте пустым, чтобы разрешить загрузку любого типа файла. Допустимы несколько значений (одна строка для каждого значения). @@ -4649,7 +4730,7 @@ ru: project_mandate: "Мандат проекта" submission: description_template: > - **Этот пакет работ был автоматически создан по завершении рабочего процесса %{wizard_name}.** Артефакт в формате PDF, содержащий всю представленную информацию, был создан и прикреплен к этому рабочему пакету для справки и целей аудита. Если Вам необходимо обновить или повторно выполнить шаги инициации, Вы можете в любой момент снова открыть мастер, воспользовавшись приведенной ниже ссылкой: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "Когда пользователь подает запрос на инициирование проекта, будет создан новый пакет работ с запросом, прикрепленным в виде PDF-файла. Настройки, приведенные ниже, определяют тип, статус и назначение этого нового рабочего пакета." work_package_type: "Тип пакета работ" work_package_type_caption: "Тип пакета работ, который должен использоваться для хранения завершенного артефакта." @@ -4817,6 +4898,7 @@ ru: Примечание: Если этот параметр включен, значок с вашим статусом установки будет отображен в панели администрирования %{information_panel_label} и на домашней странице. Он отображается только администраторам.
    Знак будет проверять текущую версию OpenProject в официальной базе данных релизов OpenProject для оповещения вас о каких-либо обновлениях или известных уязвимостях. Для дополнительной информации, необходимой для проверки доступных обновлений, и о том как отключить эту проверку, пожалуйста, посетите конфигурации документации. text_own_membership_delete_confirmation: "Вы собираетесь удалить все или некоторые разрешения, доступные Вам. Вы не сможете редактировать проект после этого действия. Вы уверены?" text_permanent_delete_confirmation_checkbox_label: "Я понимаю, что это удаление невозможно отменить" + text_permanent_remove_confirmation_checkbox_label: "Я понимаю, что это удаление не может быть отменено" text_plugin_assets_writable: "Папка активов дополнения(plugin) доступна для записи" text_powered_by: "С использованием %{link}" text_project_identifier_info: "Разрешены только строчные буквы (a-z), цифры, тире и знаки подчеркивания, начинать с буквы нижнего регистра." @@ -5316,3 +5398,8 @@ ru: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Выход из OpenProject" + warning_message: "Вы собираетесь покинуть OpenProject и посетить внешний сайт. Пожалуйста, имейте в виду, что внешние сайты не находятся под нашим контролем и могут иметь другую политику конфиденциальности и безопасности." + continue_message: "Вы уверены, что хотите перейти по следующей внешней ссылке?" + continue_button: "Перейти на внешний сайт" diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index 1a1de4861cb..cd01ac68b62 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -109,6 +109,23 @@ rw: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ rw: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ rw: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ rw: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ rw: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ rw: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ rw: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ rw: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ rw: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ rw: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ rw: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ rw: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ rw: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ rw: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ rw: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ rw: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ rw: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ rw: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ rw: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ rw: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ rw: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ rw: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ rw: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ rw: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ rw: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ rw: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ rw: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ rw: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ rw: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ rw: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 4dbc68370a7..3302e32e485 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -109,6 +109,23 @@ si: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ si: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: දැනට වර්ග නොමැත. form: @@ -605,6 +623,9 @@ si: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ si: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ si: create_button: "සාදන්න" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "ප්රවේශ ටෝකනය නැවත සකස් කිරීමට අපොහොසත් විය: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ si: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: වාර්තා කිරීමට දැනට කිසිදු ප්රවෘත්තියක් නොමැත. @@ -1231,6 +1258,10 @@ si: onthefly: "Automatic user creation" port: "කෙවෙනිය" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "භූමිකාවන්" notification: @@ -1489,6 +1520,7 @@ si: even: "පවා විය යුතුය." exclusion: "වෙන් කර ඇත." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "ඉතා විශාලයි (උපරිම ප්රමාණය බයිට් %{count} කි)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ si: not_a_datetime: "වලංගු දිනය කාලය නොවේ." not_a_number: "අංකයක් නොවේ." not_allowed: "අතුරුදහන් අවසරයන් නිසා අවලංගු වේ." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "පූර්ණ සංඛ්යාලයක් නොවේ." not_an_iso_date: "වලංගු දිනයක් නොවේ. අවශ්ය ආකෘතිය: YYY-MM-DD." not_same_project: "එකම ව්යාපෘතියට අයත් නොවේ." @@ -1919,7 +1952,12 @@ si: token/api: one: ටෝකනය ප්රවේශ other: Access tokens - type: "වර්ගය" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "පරිශීලක" version: "අනුවාදය" workflow: "කාර්ය ප්රවාහ" @@ -2136,6 +2174,7 @@ si: button_click_to_reveal: "හෙළි කිරීමට ක්ලික් කරන්න" button_close: "වසන්න" button_collapse_all: "සියල්ල කඩා වැටෙන්න" + button_confirm: "Confirm" button_configure: "සකසන්න" button_continue: "ඉදිරියට යන්න" button_complete: "Complete" @@ -2168,6 +2207,7 @@ si: button_print: "මුද්රණය" button_quote: "උපුටා" button_remove: ඉවත් කරන්න + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "නැවත නම් කරන්න" button_replace: "ප්රතිස්ථාපනය කරන්න" @@ -2419,7 +2459,7 @@ si: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ si: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ si: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ si: custom_actions: title: "අභිරුචි ක්‍රියාමාර්ග" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ si: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ si: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "ඔබගේ ස්ථාපනය PostgreSQL වෙත සංක්රමණය කිරීම" @@ -2892,14 +2936,17 @@ si: instructions_after_error: "%{signin}ක්ලික් කිරීමෙන් ඔබට නැවත පුරනය වීමට උත්සාහ කළ හැකිය. දෝෂය නොනැසී පවතී නම්, ඔබේ පරිපාලක උදව් ඉල්ලා සිටින්න." menus: admin: - mail_notification: "වි-ල් ස්කිනිම්" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "වි-ල් ස්කිනිම්" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "ප්රදර්ශනය කිරීමට ප්රවේශ ටෝකන නොමැත" description: "ඔවුන් සියලු අක්රීය කර ඇත. පරිපාලන මෙනුවේ ඒවා නැවත සක්රීය කළ හැකිය." @@ -2909,34 +2956,56 @@ si: expiration: "කල් ඉකුත්" indefinite_expiration: "කිසි විටෙකත්" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "යෙ.ක්‍ර.මු." + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ si: label_always_visible: "සෑම විටම ප්රදර්ශනය" label_announcement: "නිවේදනය" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API ප්රවේශ යතුර" label_api_access_key_created_on: "%{value} පෙර නිර්මාණය කරන ලද API ප්රවේශ යතුර" label_api_access_key_type: "යෙ.ක්‍ර.මු." @@ -3253,6 +3323,7 @@ si: label_journal_diff: "විස්තරය සංසන්දනය" label_language: " " label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "ව්යාපෘතියකට පනින්න..." label_keyword_plural: "මූල පද" @@ -3430,9 +3501,6 @@ si: label_project_hierarchy: "ව්යාපෘති ධූරාවලිය" label_project_mappings: "ව්‍යාපෘති" label_project_new: "නව ව්යාපෘතිය" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "ව්‍යාපෘති" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ si: notice_not_authorized: "මෙම පිටුවට ප්රවේශ වීමට ඔබට අවසර නැත." notice_not_authorized_archived_project: "ඔබ ප්රවේශ වීමට උත්සාහ කරන ව්යාපෘතිය සංරක්ෂණය කර ඇත." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "ඔබගේ මුරපදය නිවැරදි නොවේ. දිගටම කරගෙන යා නොහැක." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "සොයාගෙන ඇත %{number} ප්රතිඵල. \n පළමු ප්රතිඵලය අවධානය යොමු කිරීමට ටැබ්." notice_principals_found_single: "එක් ප්රති result ලයක් තිබේ. \n එය අවධානය යොමු කිරීමට ටැබ්." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ si: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ si: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ si: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ si: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ si: සටහන: සක්රීය කර ඇත්නම්, මෙය %{information_panel_label} පරිපාලන පැනලයේ ඔබේ ස්ථාපන තත්ත්වය සහිත ලාංඡනයක් සහ මුල් පිටුවේ පෙන්වනු ඇත. එය පරිපාලකයින්ට පමණක් පෙන්වනු ලැබේ.
    මෙම ලාංඡනය මඟින් ඔබගේ වර්තමාන OpenProject අනුවාදය නිල OpenProject නිකුතු දත්ත ගබඩාවට එරෙහිව පරීක්ෂා කරනු ඇත. චෙක්පත සපයන දේ පිළිබඳ වැඩි විස්තර සඳහා, ලබා ගත හැකි යාවත්කාලීන ලබා දීමට අවශ්ය දත්ත මොනවාද, සහ මෙම චෙක්පත අක්රිය කරන්නේ කෙසේද, කරුණාකර මානකරන ලියකියවිලිවෙත පිවිසෙන්න. text_own_membership_delete_confirmation: "ඔබ ඔබේ අවසර කිහිපයක් හෝ සියල්ල ඉවත් කිරීමට ආසන්නව සිටින අතර ඉන් පසුව මෙම ව්යාපෘතිය සංස්කරණය කිරීමට තවදුරටත් නොහැකි වනු ඇත.\nඔබට දිගටම කරගෙන යාමට අවශ්ය බව ඔබට විශ්වාසද?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "ප්ලගිනය වත්කම් නාමාවලිය ලිවිය හැකි" text_powered_by: "%{link}විසින් තල්ලු" text_project_identifier_info: "අඩු සිද්ධි අකුරු (a-z), අංක, ඩෂ් සහ යටි ඉරි වලට පමණක් අවසර ඇත, අඩු සිද්ධි අකුරකින් ආරම්භ කළ යුතුය." @@ -5220,3 +5298,8 @@ si: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index dae7687c168..d4b3dbed4df 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -109,6 +109,23 @@ sk: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -593,6 +610,7 @@ sk: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Momentálne nie sú k dispozícii žiadne typy. form: @@ -607,6 +625,9 @@ sk: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -620,6 +641,7 @@ sk: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -727,9 +749,11 @@ sk: create_button: "Vytvoriť" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Nepodarilo sa obnoviť prístupový token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -739,6 +763,9 @@ sk: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: V súčasnosti nie sú žiadne novinky pre nahlásenie. @@ -1249,6 +1276,10 @@ sk: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roly" notification: @@ -1507,6 +1538,7 @@ sk: even: "musí byť párne." exclusion: "patrí medzi vyhradené výrazy." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "je príliš veľká (maximálna veľkosť je %{count} bytov)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1529,7 +1561,8 @@ sk: not_a_datetime: "nie je platný dátum a čas." not_a_number: "nie je číslo." not_allowed: "je neplatné kvôli chýbajúcim oprávneniam." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "nie je celé číslo." not_an_iso_date: "nie je platný dátum. Požadovaný formát: RRRR-MM-DD." not_same_project: "nepodlieha rovnakému projektu." @@ -1963,7 +1996,16 @@ sk: few: Access tokens many: Access tokens other: Access tokens - type: "Typ" + token/rss: + one: "RSS token" + few: "RSS tokens" + many: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + many: "Types" + other: "Types" user: "Užívateľ(ka)" version: "Verzia" workflow: "Pracovný postup" @@ -2188,6 +2230,7 @@ sk: button_click_to_reveal: "Kliknutím zobrazíte" button_close: "Zatvoriť" button_collapse_all: "Zbaliť všetko" + button_confirm: "Confirm" button_configure: "Konfigurovať" button_continue: "Pokračovať" button_complete: "Complete" @@ -2220,6 +2263,7 @@ sk: button_print: "Tlač" button_quote: "Citovať" button_remove: Vymazať + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Premenovať" button_replace: "Nahradiť" @@ -2511,7 +2555,7 @@ sk: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2521,10 +2565,12 @@ sk: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2565,8 +2611,8 @@ sk: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2596,6 +2642,8 @@ sk: custom_actions: title: "Vlastné akcie" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2607,6 +2655,8 @@ sk: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2906,19 +2956,17 @@ sk: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2986,14 +3034,17 @@ sk: instructions_after_error: "Skúste sa znova prihlásiť kliknutím na %{signin}. Ak chyba pretrváva, požiadajte správcu o pomoc." menus: admin: - mail_notification: "Upozornenia e-mailom" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Upozornenia e-mailom" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Žiadne prístupové tokeny na zobrazenie" description: "Všetky boli deaktivované, opätovne ich možno aktivovať v menu administrácie." @@ -3003,34 +3054,56 @@ sk: expiration: "Expiruje" indefinite_expiration: "Nikdy" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: - title: "RSS kanál" + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" + title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3092,6 +3165,7 @@ sk: label_always_visible: "Vždy zobrazené" label_announcement: "Oznámenie" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Prístupový kľúč API" label_api_access_key_created_on: "Prístupový kľúč pre API vytvorený %{value} vzad" label_api_access_key_type: "API" @@ -3347,6 +3421,7 @@ sk: label_journal_diff: "Porovnanie popisu" label_language: "Jazyk" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Skok do projektu..." label_keyword_plural: "Kľúčové slová" @@ -3524,9 +3599,6 @@ sk: label_project_hierarchy: "Hierarchia projektu" label_project_mappings: "Projekty" label_project_new: "Nový projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekty" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3991,7 +4063,7 @@ sk: notice_not_authorized: "Nemáte dostatočné oprávnenia na zobrazenie tejto stránky." notice_not_authorized_archived_project: "Projekt, ku ktorému sa snažíte pristupovať, bol archivovaný." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Heslo nie je správne. Nie je možné pokračovať." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Nájdených %{number} výsledkov. \nStlačte TAB pre prechod na prvý výsledok." notice_principals_found_single: "Bol nájdený jeden výsledok.\nStlačením tlačidla TAB zobraziť." notice_parent_item_not_found: "Parent item not found." @@ -4346,6 +4418,9 @@ sk: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4358,11 +4433,17 @@ sk: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentácia" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4547,7 +4628,7 @@ sk: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4653,7 +4734,7 @@ sk: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4821,6 +4902,7 @@ sk: Poznámka: Ak je táto možnosť povolená, zobrazí sa v štýle %{information_panel_label} na panely správcu, a na domovskej stránke. Zobrazuje sa iba administrátorom.
    Znak skontroluje vašu aktuálnu verziu OpenProject s oficiálnou verziu databázy OpenProject, ktorá vás upozorní na akékoľvek aktualizácie alebo známe chyby. Ďalšie informácie o tom, čo daná kontrola poskytuje, aké údaje sú potrebné na poskytovanie dostupných aktualizácií a ako zakázať túto kontrolu, prosím navštívte dokumentáciu konfigurácie. text_own_membership_delete_confirmation: "Chystáte sa odstrániť jedno respektíve viac vašich povolení, pričom po aplikovaní zmien môžte stratiť možnosť naďalej upravovať nastavenia projektu. Naozaj chcete pokračovať?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Povolený zápis do priečinka pre pluginy" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Sú povolené len malé písmená (a-z), čísla, pomlčky a podčiarkovníky, hodnota musí začínať malým písmenom." @@ -5321,3 +5403,8 @@ sk: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 04218b8e1bb..8c7bfb09100 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -109,6 +109,23 @@ sl: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -592,6 +609,7 @@ sl: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Trenutno ni na voljo nobenih vrst. form: @@ -606,6 +624,9 @@ sl: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,6 +640,7 @@ sl: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -726,9 +748,11 @@ sl: create_button: "Ustvari" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Neuspešna poenostavitev \"dostopnega simbola\": %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -738,6 +762,9 @@ sl: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Trenutno ni nobenih novic za poročanje. @@ -1248,6 +1275,10 @@ sl: onthefly: "Samodejno ustvarjanje uporabnika" port: "Vrata" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Vloge" notification: @@ -1506,6 +1537,7 @@ sl: even: "mora biti enakomerno." exclusion: "je rezervirano." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "je preveliko (največja velikost je %{count} Bytov)." filter_does_not_exist: "filter does not exist." format: "se ne ujema s pričakovano obliko '%{expected}'." @@ -1528,7 +1560,8 @@ sl: not_a_datetime: "ni veljaven datum." not_a_number: "ni število." not_allowed: "ni veljavno, saj manjka dovoljenje. " - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "ni celo število. " not_an_iso_date: "neveljaven čas. Potreben format: YYYY-MM-DD." not_same_project: "ne pripada istemu projektu" @@ -1962,7 +1995,16 @@ sl: two: Access tokens few: Access tokens other: Access tokens - type: "Vrsta" + token/rss: + one: "RSS token" + two: "RSS tokens" + few: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + two: "Types" + few: "Types" + other: "Types" user: "Uporabnik" version: "Različica" workflow: "Potek dela" @@ -2187,6 +2229,7 @@ sl: button_click_to_reveal: "Klikni za razkritje" button_close: "Zapri" button_collapse_all: "Strni vse" + button_confirm: "Confirm" button_configure: "Nastavi" button_continue: "Nadaljuj" button_complete: "Complete" @@ -2219,6 +2262,7 @@ sl: button_print: "Natisni" button_quote: "Citiraj" button_remove: Odstrani + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Preimenuj" button_replace: "Zamenjaj" @@ -2510,7 +2554,7 @@ sl: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2520,10 +2564,12 @@ sl: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2564,8 +2610,8 @@ sl: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2595,6 +2641,8 @@ sl: custom_actions: title: "Dejanja po meri" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2606,6 +2654,8 @@ sl: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Nadomestni uporabniki description: > @@ -2905,19 +2955,17 @@ sl: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Selitev namestitve na PostgreSQL" @@ -2985,14 +3033,17 @@ sl: instructions_after_error: "Lahko se poskusite znova prijaviti s klikom na %{signin}. Če napaka še vedno traja, za pomoč prosite svojega skrbnika." menus: admin: - mail_notification: "E-poštna obvestila" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "E-poštna obvestila" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Za prikaz ni nobenega računa" description: "Vsi so onemogočeni. Ponovno jih je mogoče omogočiti v skrbniškem meniju." @@ -3002,34 +3053,56 @@ sl: expiration: "Poteče" indefinite_expiration: "Nikoli" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3091,6 +3164,7 @@ sl: label_always_visible: "Stalno prikazano" label_announcement: "Objava" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API dostopni ključ" label_api_access_key_created_on: "Atom dostopni ključ narejen %{value} nazaj" label_api_access_key_type: "API" @@ -3346,6 +3420,7 @@ sl: label_journal_diff: "Opisna Primerjava" label_language: "Jezik" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Skoči na projekt..." label_keyword_plural: "Ključne besede" @@ -3523,9 +3598,6 @@ sl: label_project_hierarchy: "Struktura projekta" label_project_mappings: "Projekti" label_project_new: "Nov projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekti" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3991,7 +4063,7 @@ sl: notice_not_authorized: "Nimate privilegijev za dostop do te strani." notice_not_authorized_archived_project: "Projekt, do katerega poskušate dostopati, je bil arhiviran." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Vaše geslo ni pravilno. Ne morete nadaljevati." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "Najdeno je %{number} rezultatov.\nKliknite tipko tab da fokusirate prvi rezultat." notice_principals_found_single: "Najden je en rezultat.\nPritisnite tab, da ga prikaže." notice_parent_item_not_found: "Parent item not found." @@ -4345,6 +4417,9 @@ sl: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4357,11 +4432,17 @@ sl: setting_apiv3_cors_origins_text_html: > To so izviri, ki jim je dovoljeno dostopati do OpenProject API, če je CORS omogočen.
    Preverite dokumentacijo o glavi izvira kako navesti pričakovane vrednosti. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentacija" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4546,7 +4627,7 @@ sl: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4652,7 +4733,7 @@ sl: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4820,6 +4901,7 @@ sl: 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: "Odstranili boste nekaj ali vsa dovoljenja in po tem morda ne boste mogli več urejati tega projekta.\nAli ste prepričani, da želite nadaljevati?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Imenik vtičnikov se lahko zapiše" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Dovoljene so samo male črke (a-z), številke, črtice in podčrtaji, ki se začnejo z malo začetnico." @@ -5321,3 +5403,8 @@ sl: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index 3489ad5f1da..3718a768962 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -109,6 +109,23 @@ sr: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -592,6 +609,7 @@ sr: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -606,6 +624,9 @@ sr: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,6 +640,7 @@ sr: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -720,9 +742,11 @@ sr: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -732,6 +756,9 @@ sr: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1240,6 +1267,10 @@ sr: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1498,6 +1529,7 @@ sr: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1520,7 +1552,8 @@ sr: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1941,7 +1974,14 @@ sr: one: Access token few: Access tokens other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + few: "RSS tokens" + other: "RSS tokens" + type: + one: "Type" + few: "Types" + other: "Types" user: "User" version: "Verzija" workflow: "Workflow" @@ -2162,6 +2202,7 @@ sr: button_click_to_reveal: "Click to reveal" button_close: "Zatvori" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2194,6 +2235,7 @@ sr: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2465,7 +2507,7 @@ sr: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2475,10 +2517,12 @@ sr: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2519,8 +2563,8 @@ sr: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2550,6 +2594,8 @@ sr: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2561,6 +2607,8 @@ sr: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2859,19 +2907,17 @@ sr: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2939,14 +2985,17 @@ sr: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2956,34 +3005,56 @@ sr: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -3045,6 +3116,7 @@ sr: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3300,6 +3372,7 @@ sr: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3477,9 +3550,6 @@ sr: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3944,7 +4014,7 @@ sr: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4298,6 +4368,9 @@ sr: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4310,11 +4383,17 @@ sr: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4499,7 +4578,7 @@ sr: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4605,7 +4684,7 @@ sr: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4773,6 +4852,7 @@ sr: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5271,3 +5351,8 @@ sr: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 00a76ac5f81..4750ddb4ee9 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -109,6 +109,23 @@ sv: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ sv: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Det finns för närvarande inga typer tillgängliga. form: @@ -605,6 +623,9 @@ sv: work_package_priorities: new_label: "Ny prioritet" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ sv: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ sv: create_button: "Skapa" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Misslyckades med att återställa åtkomst-token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ sv: notice_api_token_revoked: "API-token har tagits bort. För att skapa en ny token använd knappen i API-avsnittet." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Det finns för närvarande inget att rapportera. @@ -1231,6 +1258,10 @@ sv: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roll" notification: @@ -1489,6 +1520,7 @@ sv: even: "måste vara jämn." exclusion: "är reserverat." feature_disabled: är inte tillgänglig. + feature_disabled_for_project: is disabled for this project. file_too_large: "är för stor (största storleken är %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ sv: not_a_datetime: "är inte en giltig datumtid." not_a_number: "är inte ett nummer." not_allowed: "är inte tillåtet på grund av saknade behörigheter." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "är inte ett heltal." not_an_iso_date: "är inte ett giltigt datum. Använd formatet ÅÅÅÅ-MM-DD." not_same_project: "tillhör inte samma projekt." @@ -1919,7 +1952,12 @@ sv: token/api: one: Åtkomstnyckel other: Åtkomstnycklar - type: "Typ" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "Användare" version: "Version" workflow: "Arbetsflöde" @@ -2136,6 +2174,7 @@ sv: button_click_to_reveal: "Klicka för att visa" button_close: "Stäng" button_collapse_all: "Fäll ihop alla" + button_confirm: "Confirm" button_configure: "Konfigurera" button_continue: "Fortsätt" button_complete: "Complete" @@ -2168,6 +2207,7 @@ sv: button_print: "Skriv ut" button_quote: "Citat" button_remove: Ta bort + button_remove_permanently: "Remove permanently" button_remove_reminder: "Ta bort påminnelse" button_rename: "Ändra namn" button_replace: "Ersätt" @@ -2419,7 +2459,7 @@ sv: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Interna kommentarer custom_actions: Anpassade åtgärder custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ sv: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ sv: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ sv: custom_actions: title: "Anpassade åtgärder" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ sv: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ sv: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Uppgradera till Enterprise utgåvan" postgres_migration: "Migrera din installation till PostgreSQL" @@ -2892,14 +2936,17 @@ sv: instructions_after_error: "Du kan försöka logga in igen genom att klicka på %{signin}. Om felet kvarstår, be din systemadministratör om hjälp." menus: admin: - mail_notification: "E-postaviseringar" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregering" api_and_webhooks: "API och webhooks" + mail_notification: "E-postaviseringar" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Lägg till…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Inga åtkomstnycklar att visa" description: "Alla nycklar har visats. Du kan återaktivera dom i administrationsmenyn." @@ -2909,34 +2956,56 @@ sv: expiration: "Upphör" indefinite_expiration: "Aldrig" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." + static_token_name: "API token" disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: - static_token_name: "API-token" + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." - static_token_name: "RSS-token" + static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Fillagring" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Okänd lagring" notifications: reasons: @@ -2998,6 +3067,7 @@ sv: label_always_visible: "Visas alltid" label_announcement: "Meddelande" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API åtkomstnyckel" label_api_access_key_created_on: "API åtkomstnyckel skapade %{value} sedan" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ sv: label_journal_diff: "Jämför beskrivning" label_language: "Språk" label_languages: "Språk" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Hoppa till projekt..." label_keyword_plural: "Nyckelord" @@ -3430,9 +3501,6 @@ sv: label_project_hierarchy: "Projekthierarki" label_project_mappings: "Projekt" label_project_new: "Nytt projekt" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projekt" label_project_list_plural: "Projektlistor" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ sv: notice_not_authorized: "Du har inte behörighet att komma åt denna sida." notice_not_authorized_archived_project: "Projektet som du försöker komma åt har arkiverats." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Ditt lösenord är inte korrekt. Kan inte fortsätta." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "%{number} resultat hittades. Använd TAB för att fokusera på det första." notice_principals_found_single: "Ett resultat. Använd TAB för att fokusera på det." notice_parent_item_not_found: "Parent item not found." @@ -4247,6 +4315,9 @@ sv: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4259,11 +4330,17 @@ sv: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Dokumentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4448,7 +4525,7 @@ sv: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4554,7 +4631,7 @@ sv: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4722,6 +4799,7 @@ sv: Obs: om aktiverad, kommer detta att visa ett märke med din installationsstatus i administrationspanelen %{information_panel_label} och på startsidan. Det visas endast för administratörer.
    Emblemet kommer att kontrollera din nuvarande OpenProject-version mot den officiella OpenProject-utgåvans databas för att varna dig om eventuella uppdateringar eller kända sårbarheter. För mer information om vad kontrollen ger, vilka uppgifter som behövs för att tillhandahålla tillgängliga uppdateringar, och hur du inaktiverar denna kontroll, besök konfigurationsdokumentationen. text_own_membership_delete_confirmation: "Du håller på att ta bort några eller alla av dina behörigheter och kommer därefter inte längre att kunna redigera detta projekt. Är du säker på att du vill fortsätta?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Katalogen \"Plugin assets\" skrivbar" text_powered_by: "Drivs av %{link}" text_project_identifier_info: "Bara gemena bokstäver (a-z), siffror, bindestreck och understreck tillåts och måste dessutom börja med en gemen bokstav." @@ -5217,3 +5295,8 @@ sv: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 4447710a311..b52fad092a9 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -109,6 +109,23 @@ th: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -590,6 +607,7 @@ th: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -604,6 +622,9 @@ th: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -617,6 +638,7 @@ th: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -706,9 +728,11 @@ th: create_button: "สร้าง" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -718,6 +742,9 @@ th: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1222,6 +1249,10 @@ th: onthefly: "Automatic user creation" port: "พอร์ต" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "บทบาท" notification: @@ -1480,6 +1511,7 @@ th: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "ใหญ่เกินไป (ขนาดสูงสุดคือ %{count} ไบต์)" filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1502,7 +1534,8 @@ th: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1897,7 +1930,10 @@ th: status: "สถานะของชุดภารกิจ" token/api: other: Access tokens - type: "ประเภท" + token/rss: + other: "RSS tokens" + type: + other: "Types" user: "ผู้ใช้" version: "เวอร์ชัน" workflow: "กระบวนการทำงาน" @@ -2110,6 +2146,7 @@ th: button_click_to_reveal: "Click to reveal" button_close: "ปิด" button_collapse_all: "ยุบทั้งหมด" + button_confirm: "Confirm" button_configure: "กำหนดค่า" button_continue: "Continue" button_complete: "Complete" @@ -2142,6 +2179,7 @@ th: button_print: "Print" button_quote: "อ้างถึง" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "เปลี่ยนชื่อ" button_replace: "Replace" @@ -2373,7 +2411,7 @@ th: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2383,10 +2421,12 @@ th: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2427,8 +2467,8 @@ th: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2458,6 +2498,8 @@ th: custom_actions: title: "การกระทำ กำหนดเอง" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2469,6 +2511,8 @@ th: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2765,19 +2809,17 @@ th: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2845,14 +2887,17 @@ th: instructions_after_error: "คุณสามารถลองเข้าสู่ระบบอีกครั้งโดยคลิก %{signin} หากยังพบข้อผิดพลาด โปรดสอบถามผู้ดูแลระบบเพื่อขอความช่วยเหลือ" menus: admin: - mail_notification: "อีเมล์แจ้งเตือน" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "อีเมล์แจ้งเตือน" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2862,34 +2907,56 @@ th: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2951,6 +3018,7 @@ th: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "คีย์การเข้าถึง API" label_api_access_key_created_on: "คีย์การเข้าถึง API ซึ่งสร้างเมื่อ %{value} ที่ผ่านมา" label_api_access_key_type: "API" @@ -3206,6 +3274,7 @@ th: label_journal_diff: "เปรียบเทียบคำอธิบาย" label_language: "ภาษา" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "ไปยังโครงการ..." label_keyword_plural: "Keywords" @@ -3383,9 +3452,6 @@ th: label_project_hierarchy: "Project hierarchy" label_project_mappings: "โครงการ" label_project_new: "โครงการใหม่" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "โครงการ" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3848,7 +3914,7 @@ th: notice_not_authorized: "คุณไม่ได้รับอนุญาตให้เข้าถึงเพจนี้" notice_not_authorized_archived_project: "โครงการที่คุณกำลังพยายามเข้าถึงถูกเก็บถาวรแล้ว" notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4200,6 +4266,9 @@ th: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4212,11 +4281,17 @@ th: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4401,7 +4476,7 @@ th: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4507,7 +4582,7 @@ th: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4675,6 +4750,7 @@ th: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "สามารถบันทึก ไดเรคทอรี่ของ Plugin asset ได้" text_powered_by: "ดำเนินการโดย %{link}" text_project_identifier_info: "ใช้ได้เฉพาะตัวพิมพ์เล็ก (a-z), ตัวเลข เส้นประ และขีดใต้ โดย ต้องเริ่มต้น ด้วยตัวอักษรพิมพ์เล็กเท่านั้น" @@ -5169,3 +5245,8 @@ th: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index f663e9a4a5c..c2e986d52cb 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -87,7 +87,7 @@ tr: token_placeholder: "Enterprise sürümü destek anahtarınızı buraya yapıştırın" add_token: "Bir Enterprise sürümü destek belirteci yükleyin" replace_token: "Geçerli destek anahtarını değiştirin" - order: "Enterprise on-premises edition sipariş edin" + order: "Kurumsal on-premises sürümü sipariş edin" paste: "Enterprise sürümü destek belirtecinizi yapıştırın" required_for_feature: "Bu eklenti, yalnızca etkin bir Enterprise sürümü destek belirteci ile kullanılabilir." enterprise_link: "Daha fazla bilgi için burayı tıklatın." @@ -109,6 +109,23 @@ tr: explanation: text: "Bir kullanıcının bireysel eylemleri (örneğin, bir iş paketini iki kez güncelleme), yaş farkı belirtilen zaman aralığından azsa tek bir eylemde toplanır. Uygulama içinde tek bir eylem olarak görüntülenecektir. Bu aynı zamanda gönderilen e-posta sayısını azaltarak bildirimleri aynı süre kadar geciktirecek ve ayrıca %{webhook_link} gecikmesini etkileyecektir." link: "webhook" + mcp_configurations: + index: + description: "MCP (Model Bağlam Protokolü), AI ajanlarının bu OpenProject sisteminde sunulan araç ve kaynakları kullanıcılara erişilebilir kılmasını sağlar." + resources_heading: "Kaynaklar" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Kaynakları güncelle" + tools_heading: "Araçlar" + tools_description: "OpenProject aşağıdaki araçları destekler. Her biri etkinleştirilebilir, adı ve açıklaması değiştirilebilir. Daha fazla bilgi için [documentation on MCP tools](docs_url)." + tools_submit: "Araçları güncelle" + multi_update: + success: "MCP yapılandırmaları başarıyla güncellendi." + server_form: + description_caption: "MCP sunucusunun, ona bağlanan diğer uygulamalara nasıl tanımlanacağı." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP yapılandırması güncellenemedi." + success: "MCP yapılandırması başarıyla güncellendi." scim_clients: authentication_methods: sso: "Kimlik sağlayıcıdan JWT" @@ -191,7 +208,7 @@ tr: error_cannot_act_self: "Kendi yüklediğiniz dosyalar üzerinde işlem yapamazsınız." attribute_help_texts: caption: "This short version will be displayed as caption of the attribute." - note_public: "Any text and images you add to this field are publicly visible to all logged in users." + note_public: "Bu alana eklediğiniz herhangi bir metin ve resim, oturum açmış tüm kullanıcılar tarafından görülebilir!" text_overview: "Bu görünümde, öznitelikleri görünüm için özel yardım metinler oluşturabilirsiniz. Tanımladığınızda, bu metinler, aidiyet öznitelik yanındaki Yardım simgesini tıklayarak gösterilebilir." show_preview: "Metni önizle" add_new: "Yardım metni ekle" @@ -352,7 +369,7 @@ tr: instructions: is_required: all: "Mark the custom field as required. This will make it mandatory to fill in the field when creating new resources. Existing resources will not require a value when being updated." - project: "Required attributes need to be filled out by the user on project creation if the field is active ('For all projects' set or copying from a project/template in which the field is active). Existing projects will not require a value when being updated." + project: "Alan etkin olduğu durumda, zorunlu alanlar yalnızca proje oluşturulurken doldurulmak zorundadır(‘Tüm projeler için’ ayarı yapılmışsa veya alanın etkin olduğu bir proje/şablondan kopyalama yapılıyorsa). Mevcut projeler güncellenirken bu alanlar için değer girilmesi gerekmez." is_for_all: all: "Mark the custom field as available in all existing and new projects." project: "Mark the attribute as available in all existing and new projects." @@ -386,8 +403,8 @@ tr: concatenation: single: "ya da" danger_dialog: - confirmation_live_message_checked: "The button to proceed is now active." - confirmation_live_message_unchecked: "The button to proceed is now inactive. You need to tick the checkbox to continue." + confirmation_live_message_checked: "Devam etmek için düğme artık aktif." + confirmation_live_message_unchecked: "Devam etmek için düğme artık aktif değil. Devam etmek için işratlemeniz gerekli." op_dry_validation: or: "ya da" errors: @@ -522,7 +539,7 @@ tr: text: "Bu eylem, listenin içerdiği hiçbir projeyi silmeyecektir. Bu proje listesini silmek istediğinizden emin misiniz?" settings: header_details: Temel bilgiler - header_status: Status + header_status: Durum header_relations: Proje ilişkileri button_update_details: Detayları güncelle button_update_status_description: Durum açıklamasını güncelle @@ -549,13 +566,13 @@ tr: program_template_caption: "Select a template program to be used as the default for new subitems of this type." no_template: "No predefined template" template: - menu_title: "Template" - title: "Template settings" - enable_failed: "Failed to enable template mode." + menu_title: "Şablon" + title: "Şablon ayarları" + enable_failed: "Şablon modu etkinleştirilemedi." members: - excluded_roles_label: "Roles to exclude when template is applied" + excluded_roles_label: "Şablon uygulandığında hariç tutulacak roller" excluded_roles_caption: > - When creating a new project from this template, the roles selected above will be omitted. This allows you to select which members will be excluded based on their project roles. Users can then access the template for viewing purposes without being granted access to new projects created from it. + Bu şablondan yeni bir proje oluştururken, yukarıda seçilen roller atlanacaktır. Bu, proje rollerine göre hangi üyelerin hariç tutulacağını seçmenize olanak tanır. Kullanıcılar daha sonra şablona görüntüleme amacıyla erişebilir, ancak şablondan oluşturulan yeni projelere erişim izni alamazlar. actions: label_enable_all: "Tümünü etkinleştir" label_disable_all: "Tümünü devre dışı bırak" @@ -592,6 +609,7 @@ tr: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: Proje başlatma talepleri için gönderildiğinde atanmış olarak ayarlandığından bu proje niteliği devre dışı bırakılamaz. types: no_results_title_text: Şu anda hiçbir tip mevcut değil. form: @@ -606,6 +624,9 @@ tr: work_package_priorities: new_label: "Yeni öncelik" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -619,8 +640,9 @@ tr: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: İlgili proje özniteliği, zorunlu olarak tanımlanmış olması nedeniyle bu proje oluşturma isteğinde pasifleştirilemez. Söz konusu ayar, sistem yöneticisi tarafından yönetim ayarları bölümünden değiştirilebilir. status: - button_edit: Edit status + button_edit: Durumu düzenle wizard: sidebar_content_title: "Content" sections: "Sections" @@ -714,9 +736,11 @@ tr: create_button: "Oluştur" name_label: "Anahtar adı" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "API anahtarı oluşturuldu" - warning: "Bu anahtarı sadece bir kez göreceksiniz. Şimdi kopyaladığınızdan emin olun." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Erişim anahtarı sıfırlaması başarısız oldu: %{error}" failed_to_create_token: "Erişim anahtarı oluşturması başarısız oldu: %{error}" failed_to_revoke_token: "Erişim anahtarı iptal edilemedi: %{error}" @@ -726,6 +750,9 @@ tr: notice_api_token_revoked: "API belirteci silinmiştir. Yeni bir belirteç oluşturmak için lütfen API bölümündeki düğmeyi kullanın." notice_rss_token_revoked: "RSS belirteci silinmiştir. Yeni bir belirteç oluşturmak için lütfen RSS bölümündeki bağlantıyı kullanın." notice_ical_token_revoked: '"%{project_name}" projesinin "%{calendar_name}" takvimi için "%{token_name}" iCalendar belirteci iptal edildi. Bu belirtece sahip iCalendar URL''si artık geçersizdir.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: Şu anda rapor edilecek bir haber yok. @@ -758,7 +785,7 @@ tr: title: "Oturum yönetimi" instructions: "You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control." may_not_delete_current: "Şuanki oturumunuzu silemezsiniz." - deletion_warning: "Are you sure you want to revoke this session? You will be logged out on this device." + deletion_warning: "Bu oturumu iptal etmek istediğinizden emin misiniz? Bu cihazda oturumunuz kapatılacaktır." groups: member_in_these_groups: "Bu kullanıcı şu anda aşağıdaki grupların bir üyesidir:" no_results_title_text: Bu kullanıcı şu anda hiçbir gruba üye değil. @@ -812,7 +839,7 @@ tr: required: "Lütfen bir rol seçin." message: label: "Davet Mesajı" - description: "We will send an email to the user, to which you can add a personal message here. An explanation for the invitation could be useful, or perhaps a bit of information regarding the project to help them get started." + description: "Kullanıcıya, buradan kişisel bir mesaj ekleyebileceğiniz bir e-posta göndereceğiz. Davet için bir açıklama yararlı olabilir veya belki de başlamalarına yardımcı olacak projeyle ilgili bir parça bilgi olabilir." summary: next_button: "Davet gönder" success_message: @@ -838,7 +865,7 @@ tr: Tablodaki iş paketlerini vurgulamak için kullanılabilir. admin: default: - caption: Making this priority default will override the previous default priority. + caption: Bu önceliği varsayılan yapmak önceki varsayılan önceliği geçersiz kılacaktır. reactions: action_title: "Tepki" add_reaction: "Tepki ekle" @@ -1231,6 +1258,10 @@ tr: onthefly: "Otomatik kullanıcı oluşturma" port: "Port" tls_certificate_string: "LDAP sunucusu SSL sertifikası" + mcp_configuration: + enabled: Etkin + title: Başlık + description: Açıklama member: roles: "Yetkiler" notification: @@ -1254,8 +1285,8 @@ tr: true: "genel" false: "özel" queries: "Sorgular" - status_code: "Status" - status_explanation: "Status description" + status_code: "Durum" + status_explanation: "Durum açıklaması" status_codes: not_started: "Başlatılmadı" on_track: "Takipte" @@ -1410,7 +1441,7 @@ tr: force_dark_theme_contrast_caption: "Otomatik renk modu seçildiğinde Koyu modun yüksek kontrastlı versiyonunu kullanır." theme: "Renk modu" time_zone: "Zaman dilimi" - mode_guideline: "Some modes will overwrite custom theme colors for accessibility and legibility. Please select Light mode for full custom theme support." + mode_guideline: "Bazı modlar, erişilebilirlik ve okunabilirlik için özel tema renklerinin üzerine yazacaktır. Tam özel tema desteği için lütfen Aydınlık modunu seçin." daily_reminders: "Günlük hatırlatmalar" workdays: "İş Günleri" users/invitation/form_model: @@ -1489,6 +1520,7 @@ tr: even: "çift olmalı." exclusion: "ayrılmıştır." feature_disabled: mevcut değil. + feature_disabled_for_project: is disabled for this project. file_too_large: "çok büyük (en büyük boyut %{count} bayt)." filter_does_not_exist: "Filtre mevcut değil" format: "Beklenen biçim '%{expected}' ile eşleşmiyor." @@ -1511,7 +1543,8 @@ tr: not_a_datetime: "geçerli bir zaman değil." not_a_number: "bir sayı değil." not_allowed: "Eksik izinler nedeniyle geçersiz." - not_json: "geçerli bir JSON nesnesi değildir." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "bir tamsayı değil." not_an_iso_date: "geçerli bir tarih değil. Gerekli biçim:: YYYY-AA-GG." not_same_project: "aynı projeye ait değil." @@ -1544,7 +1577,7 @@ tr: attributes: content_type: blank: "Dosyanın içerik türü boş olamaz." - not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload." + not_allowlisted: "Dosya otomatik bir filtre tarafından reddedildi. '%{value}' dosyasının yüklenmesine izin verilmiyor." format: "%{message}" capability: context: @@ -1554,7 +1587,7 @@ tr: minimum: "'=' işleci ile ilke, bağlam veya kimlik için en az bir filtre içermesi gerekir." custom_field: at_least_one_custom_option: "En az bir seçeneğin uygun olması gerekir." - previous_custom_field_recalculation_unprocessed: "The recalculation of previous changes for this custom field have not been applied yet, please try again in a few minutes." + previous_custom_field_recalculation_unprocessed: "Bu özel alana ait önceki değişiklikler henüz yeniden hesaplanmadı. Lütfen birkaç dakika sonra tekrar deneyin." referenced_in_other_fields_html: one: "%{name} is used in project attribute calculation %{links}." other: "%{name} is used in project attribute calculations: %{links}." @@ -1789,7 +1822,7 @@ tr: cannot_be_in_another_project: "başka bir projede olamaz." not_a_valid_parent: "geçersizdir." schedule_manually: - cannot_be_automatically_scheduled: "cannot be set to false (automatically scheduled) as it has no predecessors or children." + cannot_be_automatically_scheduled: "öncülü veya alt öğesi olmadığı için false (otomatik zamanlama) olarak ayarlanamaz." start_date: violates_relationships: "yalnızca %{soonest_start} veya daha sonra iş paketi üst bağımlılık ilişkilerini ihlal etmediğinde ayarlanabilir." cannot_be_null: "başlangıç tarihi ve süresi bilindiğinden sıfır değerine ayarlanamaz." @@ -1874,11 +1907,11 @@ tr: models: attachment: "Dosya" attribute_help_text: - one: "Attribute help text" - other: "Attribute help texts" + one: "Öznitelik yardım metni" + other: "Öznitelik yardım metnileri" auth_provider: - one: "Authentication provider" - other: "Authentication providers" + one: "Kimlik doğrulama sağlayıcısı" + other: "Kimlik doğrulama sağlayıcıları" category: "Kategori" color: "Renk" comment: "Yorum" @@ -1886,15 +1919,15 @@ tr: custom_field: "Özel alan" "doorkeeper/application": "OAuth uygulaması" enterprise_token: - one: "Enterprise token" - other: "Enterprise tokens" + one: "Kurumsal anahtar" + other: "Kurumsal anahtarlar" forum: "Forum" global_role: "Global rol" group: "Grup" issue_priority: one: "Öncelik" other: "Öncelik" - meeting_participant: "Meeting participant" + meeting_participant: "Toplantı katılımcısı" member: "Üye" news: "Haberler" notification: @@ -1913,13 +1946,18 @@ tr: one: "Rol" other: "Yetkiler" scim_client: - one: "SCIM client" + one: "SCIM istemcisi" other: "SCIM istemcileri" status: "İş paketi durumu" token/api: one: Erişim simgesi other: Erişim belirteçleri - type: "Tür" + token/rss: + one: "RSS Anahtarı" + other: "RSS Anahtarları" + type: + one: "Tip" + other: "Tipler" user: "Kullanıcı" version: "Sürüm" workflow: "İş akışı" @@ -1935,10 +1973,10 @@ tr: other: "Ek olarak, aşağıdaki alanlarla ilgili bir sorun vardı:" field_erroneous_label: "Bu alan geçersiz:% {full_errors}\nLütfen geçerli bir değer girin. %{full_errors}." messages: - must_be_template: "must be template" - unsupported_storage_type: "is not a supported storage type." + must_be_template: "şablon olmalı" + unsupported_storage_type: "desteklenen bir depolama türü değildir." storage_error: "There was an error with the storage connection." - invalid_input: "The input is invalid." + invalid_input: "Giriş geçersiz." activity: item: created_by_on: "%{user} tarafından %{datetime} tarihinde oluşturuldu" @@ -1978,12 +2016,12 @@ tr: project_phase: activated: "etkinleştirildi" added_date: "%{date} tarihine ayarlandı" - changed_date: "changed from %{from} to %{to}" + changed_date: "%{from} adresinden %{to}olarak değiştirildi" deactivated: "devre dışı bırakmak" - deleted_project_phase: "Deleted project phase" + deleted_project_phase: "Silinen proje aşaması" phase_and_both_gates: "%{phase_message}. %{start_gate_message}, ve %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: "date deleted %{date}" + removed_date: "%{date} tarihinde silindi" #common attributes of all models attributes: active: "Aktif" @@ -2023,7 +2061,7 @@ tr: estimated_time: "Çalışma" email: "E-posta" entity_type: "Varlık" - expires_at: "Expires on" + expires_at: "Süre bitişi" firstname: "İsim" filter: "Filtre" group: "Grup" @@ -2136,6 +2174,7 @@ tr: button_click_to_reveal: "Ortaya çıkarmak için tıklayın" button_close: "Kapat" button_collapse_all: "Tümünü daralt" + button_confirm: "Confirm" button_configure: "Düzenle" button_continue: "Devam et" button_complete: "Complete" @@ -2151,7 +2190,7 @@ tr: button_download: "İndir" button_disable: "Disable" button_duplicate: "Çoğalt" - button_duplicate_and_follow: "Duplicate and follow" + button_duplicate_and_follow: "Çoğaltın ve takip edin" button_edit: "Düzenle" button_enable: "Enable" button_edit_associated_wikipage: "Edit associated wiki page: %{page_title}" @@ -2168,6 +2207,7 @@ tr: button_print: "Yazdır" button_quote: "Alıntı" button_remove: Kaldır + button_remove_permanently: "Remove permanently" button_remove_reminder: "Hatırlatmayı kaldır" button_rename: "Yeniden adlandır" button_replace: "Değiştir" @@ -2376,7 +2416,7 @@ tr: units: minute_abbreviated: one: "dakika" - other: "mins" + other: "dakika" hour: one: "saat" other: "saat" @@ -2419,7 +2459,7 @@ tr: baseline_comparison: Temel Karşılaştırmalar board_view: Gelişmiş Panolar calculated_values: Calculated values - conditional_highlighting: Koşullu Vurgulama + capture_external_links: Capture External Links internal_comments: Dahili Yorumlar custom_actions: Özel Eylemler custom_field_hierarchies: Hierarchies @@ -2429,13 +2469,15 @@ tr: edit_attribute_groups: Özellik Grubunu Düzenleme gantt_pdf_export: Gantt PDF Dışa Aktarma ldap_groups: LDAP kullanıcıları ve grup senkronizasyonu + mcp_server: nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint Dosya Depolama placeholder_users: Yer Tutucu Kullanıcılar portfolio_management: Portfolio management + project_creation_wizard: Proje başlatma talebi project_list_sharing: Proje Listesi Paylaşımı readonly_work_packages: Salt Okunur İş Paketleri - scim_api: SCIM server API + scim_api: SCIM sunucu API'si sso_auth_providers: Tek Oturum Açma team_planner_view: Takım Planlayıcı Görünümü virus_scanning: Antivirüs Taraması @@ -2473,8 +2515,8 @@ tr: description: "Referens öznitelikleri ve metni kullanarak otomatik konular oluşturun." customize_life_cycle: description: "PM2 proje döngüsü planlaması tarafından sağlananlardan farklı proje aşamaları oluşturun ve düzenleyin." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2494,7 +2536,7 @@ tr: work_package_sharing: description: "İş paketlerini proje üyesi olmayan kullanıcılarla paylaşın." project_list_sharing: - description: "Share project lists with individual users." + description: "Proje listelerini belirli kullanıcılarla paylaşın." calculated_values: description: "Calculated values allow you to create a mathematical formula based attribute using numeric values and other project attributes and custom fields." define_custom_style: @@ -2504,17 +2546,21 @@ tr: custom_actions: title: "Özel eylemler" description: "Özel eylemler, duruma, role, türe veya projeye göre belirli iş paketlerinde kullanıma sunabileceğiniz bir dizi önceden tanımlanmış eylemin tek tıkla kısayollarıdır." + mcp_server: + description: "Yapay zeka aracılarını MCP aracılığıyla OpenProject örneğinizle entegre edin." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." scim_api: title: "SCIM istemcileri" - description: "Automate user management in OpenProject by seamlessly integrating external identity services like Microsoft Entra or Keycloak through our SCIM Server API. Available starting with the Enterprise corporate plan." + description: "SCIM Server API aracılığıyla Microsoft Entra veya Keycloak gibi harici kimlik servisleriyle sorunsuz entegrasyon sağlayarak OpenProject’te kullanıcı yönetimini otomatikleştirin. Sadece Kurumsal plan başlatılırsa." sso_auth_providers: title: "Tek Oturum Açma (SSO)" description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "OpenProject'te yüklenen dosyaların diğer kullanıcılar tarafından erişilmeden önce virüslere karşı tarandığından emin olun." + project_creation_wizard: + description: "Proje yöneticilerinin proje başlatma talebini doldurmasına yardımcı olacak adım adım bir sihirbaz oluşturun." placeholder_users: title: Yer tutucu kullanıcı description: > @@ -2561,7 +2607,7 @@ tr: enabled: "Devre dışı bırak" enumeration_activities: "Zaman izleme faaliyetleri" enumeration_work_package_priorities: "İş paketi öncelikleri" - enumeration_reported_project_statuses: "Reported status" + enumeration_reported_project_statuses: "Bildirilen durum" enumeration_caption_order_changed: "Sıralama başarıyla değiştirildi." enumeration_could_not_be_moved: "Numaralandırma taşınamadı." enterprise_trials: @@ -2812,19 +2858,17 @@ tr: learn_about: "Tüm yeni özellikler hakkında daha fazla bilgi edinin" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Toplantılar: OpenProject'te iCal yanıtlarını gösterin." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Enterprise sürümüne yükseltin" postgres_migration: "Kurulumunuzu PostgreSQL'e taşıyın" @@ -2892,14 +2936,17 @@ tr: instructions_after_error: "%{signin} düğmesini tıklayarak tekrar oturum açmayı deneyebilirsiniz. Hata devam ederse, yöneticinizden yardım isteyin." menus: admin: - mail_notification: "E-posta bildirimleri" - mails_and_notifications: "E-postalar ve bildirimler" + ai: "Yapay Zeka (AI)" aggregation: "Birleştirme" api_and_webhooks: "API ve web kancaları" + mail_notification: "E-posta bildirimleri" + mails_and_notifications: "E-postalar ve bildirimler" + mcp_configurations: "Model Bağlam Protokolü (MCP)" quick_add: label: "Ekle…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "Görüntülenecek hiçbir erişim izni yok" description: "Hepsi de engellendi. Yönetim menüsünden yeniden etkinleştirilebilirler." @@ -2909,34 +2956,56 @@ tr: expiration: "Bitiş tarihi" indefinite_expiration: "Hiçbir zaman" simple_revoke_confirmation: "Bu belirteci iptal etmek istediğinizden emin misiniz?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API belirteçleri, üçüncü taraf uygulamaların REST API'leri aracılığıyla bu OpenProject kurulumunuzla iletişim kurmasına olanak tanır." + static_token_name: "API token" disabled_text: "API belirteçleri yönetici tarafından etkinleştirilmemiştir. Bu özelliği kullanmak için lütfen yöneticinize başvurun." - add_button: "API Anahtarı" - api: - static_token_name: "API belirteci" + add_button: "API anahtarı" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar abonelikleri yönetici tarafından etkinleştirilmemiştir. Bu özelliği kullanmak için lütfen yöneticinize başvurun." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth belirteçleri, üçüncü taraf uygulamaların bu OpenProject sistemine bağlanmasına izin verir." - empty_text_hint: "Sizin için yapılandırılmış ve etkin bir üçüncü taraf uygulama erişimi yok. Bu özelliği etkinleştirmek için lütfen yöneticinize başvurun." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS anahtarı" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" - text_hint: "RSS belirteçleri, kullanıcıların harici bir RSS okuyucu aracılığıyla bu OpenProject sistemindeki en son değişiklikleri takip etmelerini sağlar." - static_token_name: "RSS belirteci" - disabled_text: "RSS belirteçleri yönetici tarafından etkinleştirilmemiştir. Bu özelliği kullanmak için lütfen yöneticinize başvurun." + table_title: "RSS tokens" + text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." + static_token_name: "RSS token" + disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "Dosya depoları" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "Hesabınıza bağlı herhangi bir depolama erişimi yoktur." - revoke_token: "Bu anahtarı gerçekten kaldırmak istiyor musunuz? %{storage} adresinden tekrar giriş yapmanız gerekecektir" - removed: "Dosya Depolama belirteci başarıyla kaldırıldı" - failed: "Bir hata oluştu ve anahtar kaldırılamadı. Lütfen daha sonra tekrar deneyin." unknown_storage: "Bilinmeyen depolama" notifications: reasons: @@ -2998,6 +3067,7 @@ tr: label_always_visible: "Her zaman görüntüle" label_announcement: "Duyuru" label_angular: "AngularJS" + label_app_modules: "%{app_title} modüller" label_api_access_key: "API erişim anahtarı" label_api_access_key_created_on: "API erişim anahtarı %{value} önce oluşturuldu" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ tr: label_journal_diff: "Açıklama Karşılaştırması" label_language: "Dil" label_languages: "Diller" + label_external_links: "External links" label_locale: "Dil ve bölge" label_jump_to_a_project: "Projeye git..." label_keyword_plural: "Anahtar kelimeler" @@ -3430,9 +3501,6 @@ tr: label_project_hierarchy: "Proje hiyerarşisi" label_project_mappings: "Projeler" label_project_new: "Yeni proje" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projeler" label_project_list_plural: "Proje listesi" label_project_life_cycle: "Proje yaşam döngüsü" @@ -3895,7 +3963,7 @@ tr: notice_not_authorized: "Bu sayfaya erişme yetkiniz yok." notice_not_authorized_archived_project: "Erişmeye çalıştığınız proje arşive kaldırılmış." notice_requires_enterprise_token: "Kurumsal belirteç eksik veya bu sayfaya erişime izin vermiyor." - notice_password_confirmation_failed: "Parolanız doğru değil. Devam edilemez." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "%{number} sonuç bulundu.\nİlk sonuç için TABa basın." notice_principals_found_single: "Bir sonuç bulundu. \n Ona gitmek için TABa basın." notice_parent_item_not_found: "Üst öğe bulunamadı." @@ -3971,7 +4039,7 @@ tr: permission_commit_access: "Depoya okuma / yazma erişimi (tamamlama)" permission_copy_projects: "Proje kopyalamak" permission_copy_projects_explanation: "In template projects, this permission has a secondary function, it allows the creation of new projects derived from the template." - permission_copy_work_packages: "Duplicate work packages" + permission_copy_work_packages: "İş paketlerini çoğalt" permission_create_backup: "Yedek oluşturma" permission_delete_work_package_watchers: "Takipçi sil" permission_delete_work_packages: "İş paketi silmek" @@ -4090,11 +4158,11 @@ tr: heading: "Bu projeyi kalıcı olarak silmek istiyor musunuz?" confirmation_message_for_subprojects_html: zero: > - You are about to permanently delete all data relating to project %{name}. + Proje ile ilgili tüm verileri kalıcı olarak silmek üzeresiniz %{name}. one: > - You are about to permanently delete all data relating to project %{name} and this subproject: + Proje ile ilgili tüm verileri kalıcı olarak silmek üzeresiniz %{name} ve bu alt proje: other: > - You are about to permanently delete all data relating to project %{name} and these subprojects: + Proje ile ilgili tüm verileri kalıcı olarak silmek üzeresiniz %{name} ve bu alt projeler: filters: project_phase: "Proje aşaması: %{phase}" project_phase_any: "Proje aşaması: Herhangi bir" @@ -4247,6 +4315,9 @@ tr: setting_allowed_link_protocols: "İzin verilen bağlantı protokolleri" setting_allowed_link_protocols_text_html: >- Bu protokollerin iş paketi açıklamalarında, uzun metin alanlarında ve yorumlarda bağlantı olarak gösterilmesine izin verin. Örneğin, %{tel_code} veya %{element_code}. Her satıra bir protokol girin.
    %{http_code}, %{https_code} ve %{mailto_code} protokollerine her zaman izin verilir. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "İlk giriş yönlendirmesi" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4259,17 +4330,23 @@ tr: setting_apiv3_cors_origins_text_html: > CORS etkinleştirilirse, bunlar OpenProject API'ye erişmesine izin verilen kaynaklardır.
    Beklenen değerlerin nasıl belirtileceğini öğrenmek için lütfen Kaynak başlığındaki Belgeleri kontrol edin. setting_apiv3_write_readonly_attributes: "Salt okunur özniteliklere yazma erişimi" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "En büyük API sayfası boyutu" - setting_apiv3_max_page_instructions_html: > - API'nin yanıt vereceği maksimum sayfa boyutunu ayarlayın. Tek bir sayfada daha fazla değer döndüren API isteklerini gerçekleştirmek mümkün olmayacaktır.
    Uyarı: Lütfen bu değeri yalnızca ihtiyaç duyduğunuzdan eminseniz değiştirin. Yüksek bir değere ayarlamak önemli performans etkilerine neden olurken, sayfa başına seçeneklerden daha düşük bir değer sayfalandırılmış görünümlerde hatalara neden olur. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Belgeleme" setting_apiv3_docs_enabled: "Dokümanlar sayfasını etkinleştir" setting_apiv3_docs_enabled_instructions_html: > Dokümanlar sayfası etkinleştirildiyse, %{link} altında APIv3 belgelerinin etkileşimli bir görünümünü elde edebilirsiniz. setting_apiv3_docs_enabled_instructions_warning: > - Please be aware that enabling the API docs on a production system may expose sensitive information or result in accidental loss of data when not being careful. We recommend to only enable this setting for development purposes. + Uyarı: API dokümantasyonunu canlı ortamda etkinleştirmek güvenlik riskleri ve olası veri kaybına neden olabilir. Bu ayarı sadece geliştirme ortamlarında kullanmanızı öneririz. setting_attachment_whitelist: "Ek yükleme beyaz listesi" setting_email_delivery_method: "E-posta teslim yöntemi" setting_emails_salutation: "E-postalarda kullanıcıya şu şekilde hitap edin" @@ -4448,7 +4525,7 @@ tr: omniauth_direct_login_hint_html: > Bu seçenek etkinse, oturum açma istekleri yapılandırılmış omniauth sağlayıcısına yönlendirilir. Oturum açma açılır menüsü ve oturum açma sayfası devre dışı bırakılacaktır.
    Not: Parola girişlerini de devre dışı bırakmadığınız sürece, bu seçenek etkinleştirildiğinde kullanıcılar %{internal_path} giriş sayfasından giriş yapabilirler. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: whitelist_text_html: > Yüklenen dosyalar için geçerli dosya uzantılarının ve/veya mim türlerinin bir listesini tanımlayın.
    Dosya uzantılarını (ör. %{ext_example}) veya mime türlerini (ör. %{mime_example}) girin.
    Herhangi bir dosya türünün yüklenmesine izin vermek için boş bırakın. Birden çok değere izin verilir (her değer için bir satır). @@ -4554,7 +4631,7 @@ tr: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4562,7 +4639,7 @@ tr: status_when_submitted_caption: "The status the generated work package will transition to once the request is submitted." send_confirmation_email: "Send confirmation email to the user who submitted the project initiation request" assignee: "Assignee when submitted" - assignee_caption_html: "The user or group assigned to this project attribute will also become the assignee of the new work package. This list includes active project attributes of type User only." + assignee_caption_html: "Bu proje niteliğine atanan kullanıcı veya grup, yeni iş paketinin de atananı olacaktır. Bu liste yalnızca User türündeki aktif proje niteliklerini içerir." confirmation_email_text: "Confirmation email text" confirmation_email_default: "Hello,\n\nYou submitted a project initiation request for **%{project_name}**. It is now awaiting review.\nClick the link below to access the work package with your request." work_package_comment: "Work package comment" @@ -4722,6 +4799,7 @@ tr: Not: Etkinleştirildiğinde, bu, %{information_panel_label} yönetim panelinde ve giriş sayfasında yükleme durumunuzla birlikte bir rozet görüntüler. Sadece yöneticilere gösterilir.
    Rozet, mevcut OpenProject sürümünüzü resmi OpenProject sürüm veritabanına karşı kontrol eder ve sizi herhangi bir güncelleme veya bilinen güvenlik açığı hakkında uyarır. Çekin sağladığı, mevcut güncellemeleri sağlamak için hangi verilerin gerekli olduğu ve bu kontrolün nasıl devre dışı bırakılacağı hakkında daha fazla bilgi için lütfen yapılandırma belgelerini ziyaret edin. text_own_membership_delete_confirmation: "İzinlerinizden bazılarını veya tümünü kaldırmak üzeresiniz ve bundan sonra bu projeyi düzenleyemeyebilirsiniz. Devam etmek istediğine emin misin?" text_permanent_delete_confirmation_checkbox_label: "Bu silme işleminin geri alınamayacağını anlıyorum" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets dizini yazılabilir" text_powered_by: "%{link} tarafından destekleniyor" text_project_identifier_info: "Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir ve mutlaka küçük harfle başlamalıdır." @@ -5217,3 +5295,8 @@ tr: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index a0683278b38..d9b5db30ab3 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -109,6 +109,23 @@ uk: explanation: text: "Окремі дії користувача (напр., оновлення робочого пакета двічі) зводяться в одну дію, якщо відмінність у часі між ними менша за вказаний проміжок часу. Їх буде виведено як окремі дії в межах додатка. Крім того, це призведе до затримки сповіщень на такий самий проміжок часу, що зменшить кількість електронних листів, які надсилатимуться, а також вплине на затримку %{webhook_link}." link: "вебгука" + mcp_configurations: + index: + description: "Протокол контексту моделі дає змогу агентам ШІ надавати своїм користувачам інструменти й ресурси, доступні в цьому екземплярі OpenProject." + resources_heading: "Ресурси" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Оновити ресурси" + tools_heading: "Інструменти" + tools_description: "OpenProject реалізує наведені нижче інструменти. Кожен із них можна ввімкнути, перейменувати й описати як завгодно. Щоб дізнатися більше, ознайомтеся з [документацією щодо інструментів MCP] (docs_url)." + tools_submit: "Оновити інструменти" + multi_update: + success: "Конфігурації MCP оновлено." + server_form: + description_caption: "Опис сервера MCP для інших додатків, які підключаються до нього." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "Не вдалось оновити конфігурацію MCP." + success: "Конфігурацію MCP оновлено." scim_clients: authentication_methods: sso: "JWT від постачальника ідентифікаційних даних" @@ -590,6 +607,7 @@ uk: is_for_all_blank_slate: heading: Для всіх проєктів description: Цей атрибут проєкту активовано в усіх проєктах, оскільки встановлено прапорець «Для всіх проєктів». Його не можна деактивувати для окремих проєктів. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Наразі немає доступних типів. form: @@ -604,6 +622,9 @@ uk: work_package_priorities: new_label: "Новий пріоритет" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "Створений артефакт буде збережено як вкладення у форматі PDF у пакеті робіт артефакту." description_file_link_export: "Пакет робіт артефакту міститиме посилання на файл PDF, що зберігатиметься в зовнішньому сховищі. Знадобиться робоче файлове сховище з папками проєкту з автоматичним керуванням для цього проєкту. Зараз підтримуються лише файлові сховища Nextcloud." @@ -617,6 +638,7 @@ uk: label_request_submission: "Подання запиту" project_attributes_description: > Виберіть атрибути проєкту, які слід включити в запит на ініціювання проєкту. Цей список містить лише [атрибути проєкту](project_attributes_url), увімкнені для цього проєкту. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Редагувати статус wizard: @@ -724,9 +746,11 @@ uk: create_button: "Створити" name_label: "Ім’я маркера" created_dialog: + one_time_warning: "Ви більше не побачите цей маркер. Обов’язково скопіюйте його зараз." token/api: title: "Маркер API згенеровано" - warning: "Це єдиний раз, коли ви побачите цей маркер. Обов’язково скопіюйте його зараз." + token/rss: + title: "Маркер RSS згенеровано" failed_to_reset_token: "Не вдалося відновити маркер доступу: %{error}" failed_to_create_token: "Не вдалося створити маркер доступу: %{error}" failed_to_revoke_token: "Не вдалося відкликати маркер доступу: %{error}" @@ -736,6 +760,9 @@ uk: notice_api_token_revoked: "Маркер API видалено. Щоб створити новий, скористайтеся кнопкою в розділі API." notice_rss_token_revoked: "Маркер RSS видалено. Щоб створити новий, скористайтеся посиланням у розділі RSS." notice_ical_token_revoked: 'Маркер iCalendar «%{token_name}» для календаря «%{calendar_name}» проєкту «%{project_name}» відкликано. URL-адреса iCalendar із цим маркером зараз недійсна.' + password_confirmation_dialog: + confirmation_required: "Потрібно ввести пароль облікового запису, щоб підтвердити цю зміну." + title: "Підтвердьте свій пароль, щоб продовжити" news: index: no_results_title_text: Наразі немає жодної новини. @@ -1243,6 +1270,10 @@ uk: onthefly: "Автоматичне створення користувачів" port: "Порт" tls_certificate_string: "Сертифікат SSL сервера LDAP" + mcp_configuration: + enabled: Увімкнено + title: Заголовок + description: Опис member: roles: "Роль" notification: @@ -1501,6 +1532,7 @@ uk: even: "має бути рівним." exclusion: "зарезервовано." feature_disabled: недоступна. + feature_disabled_for_project: вимкнено для цього проєкту. file_too_large: "занадто великий (максимальний розмір -%{count} байт)" filter_does_not_exist: "фільтр не існує." format: "не відповідає очікуваному формату «%{expected}»." @@ -1523,7 +1555,8 @@ uk: not_a_datetime: "не є дійсним датою." not_a_number: "не є числом" not_allowed: "недійсний через відсутність дозволів." - not_json: "не є припустимим об’єктом JSON." + not_json: "не аналізується як JSON." + not_json_object: "не є об’єктом JSON." not_an_integer: "не є цілим числом" not_an_iso_date: "не є дійсною датою. Необхідний формат: YYYY-MM-DD." not_same_project: "не належить до одного проекту." @@ -1957,7 +1990,16 @@ uk: few: Маркери доступу many: Маркери доступу other: Маркери доступу - type: "Тип" + token/rss: + one: "Маркер RSS" + few: "Маркери RSS" + many: "Маркери RSS" + other: "Маркери RSS" + type: + one: "Тип" + few: "Типи" + many: "Типи" + other: "Типи" user: "Користувач" version: "Версія" workflow: "Робочий процес" @@ -2182,6 +2224,7 @@ uk: button_click_to_reveal: "Натисніть, щоб показати" button_close: "Закрити" button_collapse_all: "Згорнути все" + button_confirm: "Підтвердити" button_configure: "Настроювання" button_continue: "Продовжити" button_complete: "Завершити" @@ -2214,6 +2257,7 @@ uk: button_print: "Друкувати" button_quote: "Цитата" button_remove: Видалити + button_remove_permanently: "Вилучити назавжди" button_remove_reminder: "Вилучити нагадування" button_rename: "Перейменувати" button_replace: "Замінити" @@ -2505,7 +2549,7 @@ uk: baseline_comparison: Порівняння з вихідним рівнем board_view: Покращені Дошки calculated_values: Розраховані значення - conditional_highlighting: Умовне виділення + capture_external_links: Відстеження зовнішніх посилань internal_comments: Внутрішні коментарі custom_actions: Користувацькі дії custom_field_hierarchies: Ієрархії @@ -2515,10 +2559,12 @@ uk: edit_attribute_groups: Редагування груп атрибутів gantt_pdf_export: Експорт діаграми Ґантта в PDF ldap_groups: Синхронізація користувачів і груп LDAP + mcp_server: Сервер MCP nextcloud_sso: Єдиний вхід для сховища Nextcloud one_drive_sharepoint_file_storage: Сховище файлів OneDrive / SharePoint placeholder_users: Прототипи користувачів portfolio_management: Керування портфелем + project_creation_wizard: Запит на запуск проєкту project_list_sharing: Спільне використання списку проєктів readonly_work_packages: Пакети робіт лише для читання scim_api: API сервера SCIM @@ -2559,8 +2605,8 @@ uk: description: "Створюйте автоматично згенеровані теми на основі атрибутів і тексту." customize_life_cycle: description: "Створюйте й упорядковуйте етапи й проєкту, відмінні від тих, що передбачено плануванням циклу проєкту PM2." - conditional_highlighting: - description: "Потрібно, щоб виокремити певні пакети робіт? Скористайтесь умовним виділенням у таблиці пакетів робіт." + capture_external_links: + description: "Запобігайте атакам соціальної інженерії, виявляючи зовнішні посилання й попереджаючи про них користувачів перед переходом за ними." work_package_query_relation_columns: description: "Хочете переглядати зв’язки або дочірні елементи в списку пакетів робіт?" edit_attribute_groups: @@ -2590,6 +2636,8 @@ uk: custom_actions: title: "Користувацькі дії" description: "Користувацькі дії – це ярлики набору попередньо визначених дій, які ви можете включати в певні пакети робіт залежно від статусу, ролі, типу або проєкту." + mcp_server: + description: "Інтегруйте ШІ-агентів у свій екземпляр OpenProject за допомогою MCP." nextcloud_sso: title: "Єдиний вхід для сховища Nextcloud" description: "Увімкніть швидку й безпечну автентифікацію для свого сховища Nextcloud завдяки технології єдиного входу. Спростіть керування доступом і покращте взаємодію користувачів зі своїм продуктом." @@ -2601,6 +2649,8 @@ uk: description: "Дайте користувачам змогу входити через зовнішніх постачальників SSO за допомогою SAML або OpenID Connect для безперешкодного доступу й інтеграції з наявними ідентифікаційними системами." virus_scanning: description: "Переконайтеся, що вивантажені в OpenProject файли перевіряються на віруси перед тим, як стають доступними для інших користувачів." + project_creation_wizard: + description: "Створіть покроковий майстер, який допоможе менеджерам проєктів заповнити запит на запуск проєкту." placeholder_users: title: Прототипи користувачів description: > @@ -2900,19 +2950,17 @@ uk: learn_about: "Дізнайтеся більше про всі нові функції" missing: "Ще немає виділених функцій." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > - Випуск включає різноманітні нові функції і покращення, такі як: + Цей випуск містить різноманітні нові функції та покращення, такі як: new_features_list: - line_0: спільна робота з документами в реальному часі; - line_1: можливість структурувати пов’язані проєкти за допомогою програм і портфелів, щоб узгодити їх зі стратегічними цілями (доповнення версії Enterprise); - line_2: зручніше керування нарадами завдяки режиму чернетки, режиму презентації, покращеним результатам і підписці iCal; - line_3: оновлена інтеграція із SharePoint із суворішими дозволами (доповнення версії Enterprise); - line_4: 'оновлений дизайн сторінки «Огляд проєкту»: нові вкладки, віджети, які можна налаштовувати, і покращений макет;' - line_5: можливість застосовувати суворіший захист конфіденційність користувачів, які не працюють в одному проєкті; - line_6: зручніший процес створення проєктів завдяки кращому вибору шаблонів; - line_7: 'зручніший глобальний пошук: ураховує тип і статус, підвищено точність автозаповнення кількох типів даних;' - line_8: 'покращення для людей з обмеженими фізичними можливостями: вдосконалено тексти ALT і кольори діаграм.' + line_0: Автоматизований запуск проєктів (надбудова Enterprise). + line_1: "Наради: додавайте нові або наявні пакети робіт як підсумки." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Повторювані наради: копіюйте пункти порядку денного в наступну нараду." + line_4: "Випуск Community: виділення атрибутів." + line_5: Попередження перед відкриттям зовнішніх посилань у контенті, створеному користувачем (надбудова Enterprise). + line_6: Покращення продуктивності й взаємодії з користувачем, зокрема на вкладці «Дії» і в модулі «Документи». links: upgrade_enterprise_edition: "Оновлення до версії Enterprise" postgres_migration: "Міграція інсталяції в PostgreSQL" @@ -2980,14 +3028,17 @@ uk: instructions_after_error: "Ви можете спробувати ввійти знову, натиснувши %{signin}. Якщо помилка не зникне, зверніться до адміністратора за допомогою." menus: admin: - mail_notification: "Email сповіщення" - mails_and_notifications: "Електронні листи й сповіщення" + ai: "Штучний інтелект (ШІ)" aggregation: "Агрегація" api_and_webhooks: "API та вебгуки" + mail_notification: "Email сповіщення" + mails_and_notifications: "Електронні листи й сповіщення" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Додати…" my_account: access_tokens: + description: "Маркери постачальника послуг випускаються в OpenProject, що дає змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються іншими додатками, що дає змогу OpenProject отримати до них доступ." no_results: title: "Немає маркерів доступу для відображення" description: "Всі вони були відключені. Їх можна повторно ввімкнути в меню адміністрування." @@ -2997,34 +3048,56 @@ uk: expiration: "Закінчується" indefinite_expiration: "Ніколи" simple_revoke_confirmation: "Справі відкликати цей маркер?" + tabs: + client: + title: "Клієнтські маркери" + provider: + title: "Маркери постачальника послуг" token/api: + blank_description: "У вас ще немає маркера API. Щоб створити його, натисніть кнопку нижче." + blank_title: "Немає маркера API" title: "API" + table_title: "Маркери API" text_hint: "Маркери API дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject через інтерфейси REST API." + static_token_name: "Маркер API" disabled_text: "Маркери API не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." add_button: "Маркер API" - api: - static_token_name: "Маркер API" ical: + blank_description: "Щоб додати маркер iCalendar, підпишіться на новий або наявний календар у модулі календаря проєкту. У вас мають бути необхідні дозволи." + blank_title: "Немає маркера iCalendar" title: "iCalendar" + table_title: "Маркери iCalendar" text_hint_link: "Маркери iCalendar дають змогу користувачам [підписуватися на календарі OpenProject](docs_url) і переглядати актуальну інформацію про пакети робіт у зовнішніх клієнтах." disabled_text: "Підписки на iCalendar не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." - empty_text_hint: "Щоб додати маркер iCalendar, підпишіться на новий або наявний календар у модулі календаря проєкту. У вас мають бути необхідні дозволи." - oauth: + oauth_application: + active_tokens: "Активні маркери" + blank_description: "Для вас не налаштовано й не активовано доступ до сторонніх додатків." + blank_title: "Немає маркера додатка OAuth" + last_used_at: "Востаннє використано о" title: "OAuth" - text_hint: "Маркери OAuth дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject." - empty_text_hint: "Для вас не налаштовано й не ввімкнено доступ до сторонніх додатків. Щоб активувати цю функцію, зверніться до адміністратора." - rss: + table_title: "Маркери додатків OAuth" + text_hint: "Маркери додатків OAuth дають змогу стороннім додаткам обмінюватися даними із цим екземпляром OpenProject." + oauth_client: + blank_description: "Клієнтських маркерів OAuth ще не існує." + blank_title: "Немає клієнтських маркерів OAuth" + failed: "Сталася помилка й не вдалося вилучити маркер. Повторіть спробу пізніше." + integration_type: "Тип інтеграції" + table_title: "Клієнтські маркери OAuth" + text_hint: "Клієнтські маркери OAuth дають змогу цьому екземпляру OpenProject підключатися до зовнішніх додатків, таких як файлові сховища." + title: "OAuth" + remove_token: "Справді вилучити цей маркер? Вам потрібно буде знову ввійти в %{integration}." + removed: "Клієнтський маркер OAuth успішно вилучено" + unknown_integration: "Невідомо" + token/rss: + add_button: "Маркер RSS" + blank_description: "У вас ще немає маркера API. Ви можете створити його за допомогою кнопки нижче." + blank_title: "Немає маркера API" title: "RSS" + table_title: "Маркери RSS" text_hint: "Маркери RSS дають змогу користувачам зберігати останні зміни в цьому екземплярі OpenProject через зовнішній RSS-агрегатор." static_token_name: "Маркер RSS" - disabled_text: "Маркери API не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." + disabled_text: "Маркери API не ввімкнено адміністратором. Зверніться до нього, якщо вам потрібна ця функція." storages: - title: "Файлові сховища" - text_hint: "Маркери файлових сховищ підключають цей екземпляр OpenProject до зовнішнього файлового сховища." - empty_text_hint: "Немає доступу до сховища, пов’язаного з вашим обліковим записом." - revoke_token: "Справді вилучити цей маркер? Вам знадобиться знову ввійти в %{storage}" - removed: "Маркер файлового сховища вилучено" - failed: "Сталася помилка, і не вдалося вилучити маркет. Повторіть спробу пізніше." unknown_storage: "Невідоме сховище" notifications: reasons: @@ -3086,6 +3159,7 @@ uk: label_always_visible: "Завжди відображається" label_announcement: "Оголошення" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "Ключ доступу до API" label_api_access_key_created_on: "Ключ доступу до API створено %{value} тому" label_api_access_key_type: "API" @@ -3341,6 +3415,7 @@ uk: label_journal_diff: "Опис Порівняння" label_language: "Мова" label_languages: "Мови" + label_external_links: "Зовнішні посилання" label_locale: "Мова й регіон" label_jump_to_a_project: "Перейти до проекту..." label_keyword_plural: "Ключові слова" @@ -3518,9 +3593,6 @@ uk: label_project_hierarchy: "Ієрархія проектів" label_project_mappings: "Проєкти" label_project_new: "Новий проект" - label_project_initiation_request: "Новий запит на ініціювання проєкту" - label_project_creation_wizard: "Новий майстер створення проєктів" - label_project_mandate: "Новий мандат проєкту" label_project_plural: "Проєкти" label_project_list_plural: "Списки проєкту" label_project_life_cycle: "Життєвий цикл проєкту" @@ -3985,7 +4057,7 @@ uk: notice_not_authorized: "Ви не авторизовані для доступу до цієї сторінки." notice_not_authorized_archived_project: "Проект ви намагаєтеся отримати доступ до архіву." notice_requires_enterprise_token: "Токен Enterprise відсутній або не надає доступу до цієї сторінки." - notice_password_confirmation_failed: "Ваш пароль неправильний. Неможливо продовжити." + notice_password_confirmation_failed: "Введений пароль неправильний." notice_principals_found_multiple: "There are %{number} знайдені результати. \nВкладка для фокусування першого результату." notice_principals_found_single: "Знайдений один результат. Натисніть для переходу до нього." notice_parent_item_not_found: "Батьківський об’єкт не знайдено." @@ -4339,6 +4411,9 @@ uk: setting_allowed_link_protocols: "Дозволені протоколи для посилань" setting_allowed_link_protocols_text_html: >- Дозвольте відображення цих протоколів у вигляді посилань в описах пакетів робіт, довгих текстових полях і коментарях. Наприклад, %{tel_code} або %{element_code}. Вводьте по одному протоколу в рядок.
    Протоколи %{http_code}, %{https_code} і %{mailto_code} завжди дозволені. + setting_capture_external_links: "Захоплення зовнішніх посилань" + setting_capture_external_links_text: > + Якщо ввімкнено, усі зовнішні посилання у відформатованому тексті переспрямовуватимуть на попереджувальну сторінку перед переходом із додатка. Це допомагає захистити користувачів від потенційно шкідливих зовнішніх вебсайтів. setting_after_first_login_redirect_url: "Переспрямування після першого входу" setting_after_first_login_redirect_url_text_html: > Задайте шлях для переспрямування користувачів після першого входу. Якщо не задано, користувачі переспрямовуються на головну сторінку з ознайомленням.
    Наприклад: /my/page @@ -4351,11 +4426,17 @@ uk: setting_apiv3_cors_origins_text_html: > Якщо CORS увімкнено, це джерела, які можуть отримувати доступ до OpenProject API.
    Щоб дізнатися, як указати очікувані значення, ознайомтеся з Документацією щодо заголовка джерела. setting_apiv3_write_readonly_attributes: "Дозвіл для записування атрибутів лише для читання" - setting_apiv3_write_readonly_attributes_instructions_html: > - Якщо ввімкнено, адміністратори можуть записувати в API статичні атрибути лише для читання під час створення, такі як createdAt і author.
    Попередження. Цей параметр призначений, наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням справжнього автора.
    Щоб дізнатися більше про атрибути й підтримувані ресурси, перейдіть на сторінку %{api_documentation_link}. + setting_apiv3_write_readonly_attributes_instructions: > + Якщо ввімкнено, адміністратори зможуть за допомогою API записувати статичні атрибути тільки для читання під час створення, такі як createdAt та author. + setting_apiv3_write_readonly_attributes_warning: > + Це налаштування використовується, наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням справжнього автора. + setting_apiv3_write_readonly_attributes_additional: > + Щоб дізнатися більше про атрибути й підтримувані ресурси, відвідайте %{api_documentation_link}. setting_apiv3_max_page_size: "Максимальний розмір сторінки API" - setting_apiv3_max_page_instructions_html: > - Встановіть максимальний розмір сторінки, яка відповідатиме API. Неможливо виконати запити API, які повертають більше значень на сторінці. Увага: Будь ласка, змінюйте значення тільки у тому разі, якщо ви впевнені у необхідності цієї дії. Внаслідок встановлення високого значення спостерігатиметься значний вплив на продуктивність, тоді як значення, що є меншим за сторінку, призведе до появи помилок у переглядах сторінок. + setting_apiv3_max_page_size_instructions: > + Установіть максимальний розмір сторінки, яку повертатиме API. Виконувати запити до API, які повертають більше значень на одній сторінці, буде неможливо. + setting_apiv3_max_page_size_warning: > + Змінюйте це значення, лише якщо впевнені, навіщо це вам потрібно. Встановлення високого значення призведе до суттєвого впливу на продуктивність, тоді як значення, нижче за параметри кожної сторінки, призведе до помилок у посторінкових поданнях. setting_apiv3_docs: "Документація" setting_apiv3_docs_enabled: "Увімкнути сторінку документів" setting_apiv3_docs_enabled_instructions_html: > @@ -4540,7 +4621,7 @@ uk: omniauth_direct_login_hint_html: > Якщо цей параметр увімкнено, запити на вхід переспрямовуватимуться налаштованому постачальнику omniauth. Спадний список і сторінку входу буде вимкнено.
    Примітка. Якщо цей параметр увімкнено й вхід за допомогою пароля дозволено, користувачі зможуть входити зі сторінки входу %{internal_path}. remapping_existing_users_hint: > - Якщо увімкнено, дає змогу будь-якому налаштованому постачальнику ідентифікаційних даних виконувати вхід в облікові записи наявних користувачів за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше не входив через цього постачальника. Це може бути корисно при перенесенні екземпляра OpenProject в сервіс нового постачальника SSO, але не рекомендовано, якщо використовується постачальник, якому не довіряють усі користувачі вашого екземпляра. + Якщо ввімкнено, будь-який налаштований постачальник ідентифікаційних даних зможе виконувати вхід в облікові записи наявних користувачів за допомогою їхніх електронних адрес, навіть якщо користувач ніколи раніше не входив через цього постачальника. Це може бути корисно під час перенесення екземпляра OpenProject у сервіс нового постачальника SSO, але не рекомендовано, якщо використовується постачальник, якому не довіряють усі користувачі вашого екземпляра. attachments: whitelist_text_html: > Визначте список дійсних розширень файлів і/або типів MIME для завантажених файлів.
    Введіть розширення файлу (напр., %{ext_example}) або типи MIME (напр., %{mime_example}). Не вказуйте нічого, щоб дозволити завантаження будь-яких типів файлів. Ви можете вводити кілька значень (по одному в кожному рядку). @@ -4646,7 +4727,7 @@ uk: project_mandate: "Мандат проєкту" submission: description_template: > - **Цей пакет робіт автоматично створено після завершення робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить усю подану інформацію, було створено й додано в цей пакет робіт для довідки й аудиту. Якщо знадобиться оновити дані або повторити кроки ініціювання, можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним нижче: + **Цей пакет робіт автоматично створено після завершення робочого процесу «%{wizard_name}».** Артефакт у форматі PDF, що містить усю подану інформацію, було створено й додано в цей пакет робіт для довідки й аудиту. Якщо знадобиться оновити дані або повторити кроки із запуску, можна будь-коли знову відкрити майстер, скориставшись посиланням, наведеним нижче: description: "Коли користувач подає запит на ініціювання проєкту, створюється новий пакет робіт з артефактом запиту, долученим як файл PDF. Наведені нижче налаштування визначають тип, статус і виконавця нового пакета робіт." work_package_type: "Тип пакета робіт" work_package_type_caption: "Тип пакета робіт, який слід використовувати для зберігання завершеного артефакту." @@ -4814,6 +4895,7 @@ uk: Примітка: якщо цей параметр увімкнено, на екрані з'явиться значок із статусом інсталяції %{information_panel_label} панелі адміністрування та на головній сторінці. Він відображається лише адміністраторам.
    Значок перевірить поточну версію OpenProject на основі офіційної бази даних випуску OpenProject, щоб сповістити вас про будь-які оновлення або відомі уразливості. Щоб отримати додаткові відомості про те, що надає перевірка, які дані потрібні для надання доступних оновлень, та про те, як вимкнути цю перевірку, відвідайте сторінку конфігураційна документація. text_own_membership_delete_confirmation: "Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту.\nВи впевнені що хочете продовжити?" text_permanent_delete_confirmation_checkbox_label: "Я розумію, що це видалення не можна відмінити" + text_permanent_remove_confirmation_checkbox_label: "Я розумію, що вилучення не можна буде скасувати" text_plugin_assets_writable: "Каталог ресурсів модулів доступний для запису" text_powered_by: "Працює на %{link}" text_project_identifier_info: "Допускаються тільки рядкові малі букви (a-z), цифри, тире та нижнє підкреслення. Початок має бути з малої літери." @@ -4906,8 +4988,8 @@ uk: other: "тимчасово заблоковано (%{count} спроби входу в систему)" confirm_status_change: "Ви збираєтеся змінити статус %{name} Ви дійсно бажаєте продовжити?" deleted: "Видалити користувача" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Ви не можете змінити власний статус користувача." + error_admin_change_on_non_admin: "Тільки адміністратори можуть змінювати статус користувачів-адміністраторів." error_status_change_failed: "Не вдалося змінити статус користувача через такі помилки: %{errors}" invite: Запросити користувача електронною поштою invited: запрошені @@ -5313,3 +5395,8 @@ uk: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Вихід з OpenProject" + warning_message: "Ви збираєтеся перейти з OpenProject на зовнішній вебсайт. Зауважте, що ми не контролюємо зовнішні вебсайти, і вони можуть мати інші політики конфіденційності й безпеки." + continue_message: "Справді перейти за зовнішнім посиланням нижче?" + continue_button: "Перейти на зовнішній вебсайт" diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index a6003cc0c64..8ebfcff4640 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -109,6 +109,23 @@ uz: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -591,6 +608,7 @@ uz: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -605,6 +623,9 @@ uz: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -618,6 +639,7 @@ uz: label_request_submission: "Request submission" project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -713,9 +735,11 @@ uz: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -725,6 +749,9 @@ uz: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: no_results_title_text: There is currently no news to report. @@ -1231,6 +1258,10 @@ uz: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1489,6 +1520,7 @@ uz: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1511,7 +1543,8 @@ uz: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -1919,7 +1952,12 @@ uz: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2136,6 +2174,7 @@ uz: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2168,6 +2207,7 @@ uz: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2419,7 +2459,7 @@ uz: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2429,10 +2469,12 @@ uz: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2473,8 +2515,8 @@ uz: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2504,6 +2546,8 @@ uz: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2515,6 +2559,8 @@ uz: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2812,19 +2858,17 @@ uz: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -2892,14 +2936,17 @@ uz: instructions_after_error: "You can try to sign in again by clicking %{signin}. If the error persists, ask your admin for help." menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -2909,34 +2956,56 @@ uz: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: reasons: @@ -2998,6 +3067,7 @@ uz: label_always_visible: "Always displayed" label_announcement: "Announcement" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API access key" label_api_access_key_created_on: "API access key created %{value} ago" label_api_access_key_type: "API" @@ -3253,6 +3323,7 @@ uz: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3430,9 +3501,6 @@ uz: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -3896,7 +3964,7 @@ uz: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4249,6 +4317,9 @@ uz: setting_allowed_link_protocols: "Allowed link protocols" setting_allowed_link_protocols_text_html: >- Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page @@ -4261,11 +4332,17 @@ uz: setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - 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}. + setting_apiv3_write_readonly_attributes_instructions: > + If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. + setting_apiv3_write_readonly_attributes_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. + setting_apiv3_write_readonly_attributes_additional: > + For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > - Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page.
    Warning: Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. + setting_apiv3_max_page_size_instructions: > + Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > @@ -4450,7 +4527,7 @@ uz: omniauth_direct_login_hint_html: > If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. 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). @@ -4556,7 +4633,7 @@ uz: project_mandate: "Project mandate" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: + **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." work_package_type: "Work package type" work_package_type_caption: "The work package type that should be used to store the completed artifact." @@ -4724,6 +4801,7 @@ uz: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5220,3 +5298,8 @@ uz: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/crowdin/vi.seeders.yml b/config/locales/crowdin/vi.seeders.yml index 569a21a8382..92d9b9b1015 100644 --- a/config/locales/crowdin/vi.seeders.yml +++ b/config/locales/crowdin/vi.seeders.yml @@ -7,131 +7,131 @@ vi: common: colors: item_0: - name: Xanh dương (tối) + name: Màu xanh (tối) item_1: - name: Xanh dương + name: Màu xanh item_2: - name: Xanh dương (sáng) + name: Màu xanh (sáng) item_3: - name: Xanh lá cây (sáng) + name: Xanh (sáng) item_4: - name: Xanh lá cây (tối) + name: Xanh (đậm) item_5: - name: Vàng + name: màu vàng item_6: - name: Cam + name: trái cam item_7: - name: Đỏ + name: màu đỏ item_8: - name: Đỏ tươi + name: Màu đỏ tươi item_9: - name: Trắng + name: trắng item_10: - name: Xám (sáng) + name: Màu xám (sáng) item_11: - name: Xám + name: Màu xám item_12: name: Màu xám (tối) item_13: - name: Đen + name: màu đen project_phase_colors: item_0: - name: PM2 Orange + name: PM2 Cam item_1: - name: PM2 Red + name: PM2 đỏ item_2: - name: PM2 Magenta + name: PM2 màu đỏ tươi item_3: - name: PM2 Green Yellow + name: PM2 Xanh Vàng project_query_roles: item_0: - name: Người xem truy vấn dự án + name: Trình xem truy vấn dự án item_1: - name: Người chỉnh sửa truy vấn dự án + name: Trình soạn thảo truy vấn dự án work_package_roles: item_0: - name: Người chỉnh sửa gói công việc + name: Trình chỉnh sửa gói công việc item_1: name: Người bình luận gói công việc item_2: - name: Người xem gói công việc + name: Trình xem gói công việc project_roles: item_0: name: Không là thành viên item_1: - name: Ẩn danh + name: vô danh item_2: - name: Thành viên + name: thành viên item_3: - name: Người đọc + name: người đọc item_4: - name: Quản trị dự án + name: Quản trị viên dự án global_roles: item_0: name: Nhân viên và quản lý dự án item_1: - name: Standard global role + name: Vai trò toàn cầu tiêu chuẩn standard: project_phases: item_0: - name: Initiating + name: Bắt đầu item_1: - name: Lập kế hoạch - start_gate: Ready for Planning + name: lập kế hoạch + start_gate: Sẵn sàng lập kế hoạch item_2: - name: Executing - start_gate: Ready for Executing + name: đang thực thi + start_gate: Sẵn sàng thực hiện item_3: - name: Closing - start_gate: Ready for Closing + name: Đóng cửa + start_gate: Sẵn sàng đóng cửa priorities: item_0: name: Thấp item_1: name: Bình Thường item_2: - name: Cao + name: cao item_3: - name: Ngay lập tức + name: ngay lập tức projects: demo-project: name: Dự án demo - status_explanation: Tất cả các nhiệm vụ đang theo đúng tiến độ. Những người liên quan biết nhiệm vụ của họ. Hệ thống đã được thiết lập hoàn chỉnh. - description: Đây là tóm tắt ngắn gọn về mục tiêu của dự án demo này. + status_explanation: Mọi công việc đều đúng tiến độ. Những người liên quan biết nhiệm vụ của họ. Hệ thống đã được thiết lập hoàn chỉnh. + description: Đây là bản tóm tắt ngắn gọn về mục tiêu của dự án demo này. news: item_0: - title: Chào mừng đến với dự án mẫu của bạn + title: Chào mừng đến với dự án demo của bạn summary: | Chúng tôi rất vui vì bạn đã tham gia. - Trong mô-đun này, bạn có thể truyền đạt tin tức dự án đến các thành viên trong nhóm của bạn. - description: Tin tức hiện tại + Trong mô-đun này, bạn có thể truyền đạt tin tức dự án cho các thành viên trong nhóm của mình. + description: Tin tức thực tế categories: - item_0: Danh mục 1 (cần thay đổi trong cài đặt Dự án) + item_0: Loại 1 (sẽ được thay đổi trong cài đặt Dự án) queries: item_0: - name: Kế hoạch dự án + name: kế hoạch dự án item_1: - name: Các mốc thời gian + name: Các cột mốc quan trọng item_2: name: Nhiệm vụ item_3: - name: Lịch trình nhóm + name: Người lập kế hoạch nhóm boards: kanban: - name: Bảng Kanban + name: bảng Kanban basic: name: Bảng cơ bản lists: item_0: - name: Danh sách mong muốn + name: danh sách mong muốn item_1: name: Danh sách ngắn item_2: - name: Danh sách ưu tiên cho hôm nay + name: Danh sách ưu tiên cho ngày hôm nay item_3: - name: Không bao giờ + name: không bao giờ parent_child: - name: Cấu trúc phân công công việc + name: Cấu trúc phân chia công việc project-overview: widgets: item_0: @@ -141,169 +141,169 @@ vi: options: name: Bắt đầu text: | - Chúng tôi rất vui vì bạn đã tham gia! Chúng tôi khuyên bạn nên thử một vài điều để bắt đầu với OpenProject. + Chúng tôi rất vui vì bạn đã tham gia! Chúng tôi khuyên bạn nên thử một số thứ để bắt đầu trong OpenProject. - Khám phá các tính năng quan trọng nhất với [Tour hướng dẫn]({{opSetting:base_url}}/projects/demo-project/work_packages/?start_onboarding_tour=true). + Khám phá những tính năng quan trọng nhất với [Guided Tour]({{opSetting:base_url}}/projects/demo-project/work_packages/?start_onboarding_tour=true của chúng tôi). _Hãy thử các bước sau:_ - 1. *Mời các thành viên mới vào dự án của bạn*: → Đi đến [Thành viên]({{opSetting:base_url}}/projects/demo-project/members) trong điều hướng dự án. - 2. *Xem công việc trong dự án của bạn*: → Đi đến [Nhiệm vụ]({{opSetting:base_url}}/projects/demo-project/work_packages) trong điều hướng dự án. - 3. *Tạo một gói công việc mới*: → Đi đến [Nhiệm vụ → Tạo]({{opSetting:base_url}}/projects/demo-project/work_packages/new). - 4. *Tạo và cập nhật kế hoạch dự án*: → Đi đến [Kế hoạch dự án]({{opSetting:base_url}}/projects/demo-project/work_packages?query_id=##query.id:demo_project__query__project_plan) trong điều hướng dự án. - 5. *Kích hoạt các mô-đun khác*: → Đi đến [Cài đặt dự án → Mô-đun]({{opSetting:base_url}}/projects/demo-project/settings/modules). - 6. *Hoàn thành các nhiệm vụ trong dự án*: → Đi đến [Nhiệm vụ → Nhiệm vụ]({{opSetting:base_url}}/projects/demo-project/work_packages/details/##wp.id:set_date_and_location_of_conference/overview?query_id=##query.id:demo_project__query__tasks). + 1. *Mời thành viên mới tham gia dự án của bạn*: → Đi tới [Members]({{opSetting:base_url}}/projects/demo-project/members) trong điều hướng dự án. + 2. *Xem công việc trong dự án của bạn*: → Đi tới [Work packages]({{opSetting:base_url}}/projects/demo-project/work_packages) trong điều hướng dự án. + 3. *Tạo gói công việc mới*: → Đi tới [Work packages → Create]({{opSetting:base_url}}/projects/demo-project/work_packages/new). + 4. *Tạo và cập nhật kế hoạch dự án*: → Truy cập [Project plan]({{opSetting:base_url}}/projects/demo-project/work_packages?query_id=##query.id:demo_project__query__project_plan) trong điều hướng dự án. + 5. *Kích hoạt thêm các mô-đun*: → Chuyển đến [Project settings → Modules]({{opSetting:base_url}}/projects/demo-project/settings/modules). + 6. *Hoàn thành nhiệm vụ của bạn trong dự án*: → Truy cập [Work packages → Tasks]({{opSetting:base_url}}/projects/demo-project/work_packages/details/##wp.id:set_date_and_location_of_conference/overview?query_id=##query.id:demo_project__query__tasks). - Tại đây bạn sẽ tìm thấy [Hướng dẫn người dùng](https://www.openproject.org/docs/user-guide/). - Hãy cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ. Liên hệ với chúng tôi: [support[at]openproject.com](mailto:support@openproject.com). + Tại đây bạn sẽ tìm thấy [User Guides](https://www.openproject.org/docs/user-guide/) của chúng tôi. + Vui lòng cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ. Liên hệ với chúng tôi: [support[at]openproject.com](mailto:support@openproject.com). item_5: options: - name: Work Packages + name: Gói công việc item_6: options: - name: Các mốc thời gian + name: Các cột mốc quan trọng work_packages: item_0: subject: Bắt đầu dự án item_1: - subject: Tổ chức hội nghị mã nguồn mở + subject: Tổ chức hội nghị nguồn mở children: item_0: - subject: Xác định ngày và địa điểm hội nghị + subject: Đặt ngày và địa điểm của hội nghị children: item_0: - subject: Gửi lời mời tới các diễn giả + subject: Gửi lời mời tới diễn giả item_1: - subject: Liên hệ với các đối tác tài trợ + subject: Liên hệ đối tác tài trợ item_2: - subject: Tạo tài liệu quảng cáo và phát tay + subject: Tạo tài liệu tài trợ và tài liệu phát tay item_1: - subject: Mời người tham gia hội nghị + subject: Mời người tham dự hội nghị item_2: subject: Thiết lập trang web hội nghị item_2: - subject: Hội nghị + subject: hội nghị item_3: - subject: Các nhiệm vụ theo dõi + subject: Nhiệm vụ tiếp theo children: item_0: subject: Tải bài thuyết trình lên trang web item_1: - subject: Tiệc cho những người ủng hộ hội nghị :-) + subject: Tiệc dành cho những người ủng hộ hội nghị :-) description: |- - * [ ] Bia - * [ ] Đồ ăn nhẹ - * [ ] Nhạc - * [ ] Thêm bia + * [ ] Bia + * [ ] Đồ ăn nhẹ + * [ ] Âm nhạc + * [ ] Thêm bia nữa item_4: subject: Kết thúc dự án wiki: | - _Trong wiki này, bạn có thể tạo và chỉnh sửa các trang và các trang con một cách hợp tác để tạo một wiki dự án._ + _Trong wiki này bạn có thể cộng tác tạo và chỉnh sửa các trang và trang con để tạo một dự án wiki._ **Bạn có thể:** - * Chèn văn bản và hình ảnh, cũng như sao chép và dán từ các tài liệu khác - * Tạo cấu trúc trang với các trang cha - * Bao gồm các trang wiki vào menu dự án - * Sử dụng macro để bao gồm, ví dụ, bảng nội dung, danh sách nhiệm vụ, hoặc biểu đồ Gantt - * Bao gồm các trang wiki trong các trường văn bản khác, ví dụ, trang tổng quan dự án - * Bao gồm liên kết đến các tài liệu khác + * Chèn văn bản và hình ảnh, đồng thời sao chép và dán từ các tài liệu khác + * Tạo hệ thống phân cấp trang với các trang mẹ + * Đưa các trang wiki vào menu dự án + * Sử dụng macro để bao gồm, ví dụ: mục lục, danh sách gói công việc hoặc biểu đồ Gantt + * Bao gồm các trang wiki trong các trường văn bản khác, ví dụ: trang tổng quan dự án + * Bao gồm các liên kết đến các tài liệu khác * Xem lịch sử thay đổi * Xem dưới dạng Markdown - Thêm thông tin: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Thông tin thêm: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Dự án Scrum - status_explanation: Tất cả các nhiệm vụ đang theo đúng tiến độ. Những người liên quan biết nhiệm vụ của họ. Hệ thống đã được thiết lập hoàn chỉnh. - description: Đây là tóm tắt ngắn gọn về mục tiêu của dự án Scrum demo này. + status_explanation: Mọi công việc đều đúng tiến độ. Những người liên quan biết nhiệm vụ của họ. Hệ thống đã được thiết lập hoàn chỉnh. + description: Đây là bản tóm tắt ngắn gọn về mục tiêu của dự án Scrum demo này. news: item_0: - title: Chào mừng bạn đến với dự án Scrum demo của bạn + title: Chào mừng bạn đến với dự án demo Scrum của bạn summary: | Chúng tôi rất vui vì bạn đã tham gia. - Trong mô-đun này, bạn có thể truyền đạt tin tức dự án đến các thành viên trong nhóm của bạn. + Trong mô-đun này, bạn có thể truyền đạt tin tức dự án cho các thành viên trong nhóm của mình. versions: item_0: - name: Danh sách lỗi + name: Tồn đọng lỗi item_1: - name: Danh sách sản phẩm + name: Tồn đọng sản phẩm item_2: - name: Sprint 1 + name: Chạy nước rút 1 wiki: - title: Sprint 1 + title: Chạy nước rút 1 content: | - ### Cuộc họp lập kế hoạch Sprint + ### Họp lập kế hoạch Sprint - _Vui lòng ghi lại các chủ đề của cuộc họp lập kế hoạch Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp lập kế hoạch Sprint_ - * Giới hạn thời gian (8 h) - * Đầu vào: Danh sách sản phẩm - * Đầu ra: Danh sách Sprint + * Thời gian đóng hộp (8 h) + * Đầu vào: Product Backlog + * Đầu ra: Sprint Backlog - * Chia thành hai khoảng thời gian bổ sung 4 h: + * Chia làm 2 ô thời gian bổ sung 4h: - * Chủ sở hữu sản phẩm trình bày [Danh sách sản phẩm]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và các ưu tiên cho nhóm và giải thích Mục tiêu Sprint, mà nhóm phải đồng ý. Cùng nhau, họ ưu tiên các chủ đề từ Danh sách sản phẩm mà nhóm sẽ xử lý trong Sprint tiếp theo. Nhóm cam kết thực hiện các mục tiêu đã thảo luận. - * Nhóm lập kế hoạch độc lập (không có Chủ sở hữu sản phẩm) chi tiết và phân tách các nhiệm vụ từ các yêu cầu đã thảo luận để củng cố một [Danh sách Sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs). + * Chủ sản phẩm trình bày [Product Backlog]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và các ưu tiên cho nhóm, đồng thời giải thích Mục tiêu Sprint mà nhóm phải đồng ý. Họ cùng nhau ưu tiên các chủ đề trong Product Backlog mà nhóm sẽ xử lý trong lần chạy nước rút tiếp theo. Nhóm cam kết thực hiện việc giao hàng đã thảo luận. + * Nhóm lập kế hoạch một cách tự động (không có Chủ sở hữu sản phẩm) một cách chi tiết và chia nhỏ các nhiệm vụ từ các yêu cầu đã thảo luận để hợp nhất [Sprint Backlog]({{opSetting:base_url}}/projects/your-scrum-project/backlogs). ### Cuộc họp Scrum hàng ngày - _Vui lòng ghi lại các chủ đề của cuộc họp Scrum hàng ngày ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Scrum hàng ngày_ - * Cuộc họp trạng thái ngắn hàng ngày của nhóm. - * Giới hạn thời gian (tối đa 15 phút). - * Cuộc họp đứng để thảo luận các chủ đề sau từ [Bảng nhiệm vụ](##sprint:scrum_project__version__sprint_1). - * Tôi dự định làm gì cho đến cuộc họp Scrum tiếp theo? - * Điều gì đã cản trở công việc của tôi (Vướng mắc)? - * Scrum Master điều hành và ghi chú các [Vướng mắc Sprint](##sprint:scrum_project__version__sprint_1). - * Chủ sở hữu sản phẩm có thể tham gia để được thông báo. + * Cuộc họp ngắn, hàng ngày về tình trạng của nhóm. + * Thời gian được đóng khung (tối đa 15 phút). + * Cuộc họp độc lập để thảo luận về các chủ đề sau từ [Task board](##sprint:scrum_project__version__sprint_1). + * Tôi dự định làm gì cho đến buổi Daily Scrum tiếp theo? + * Điều gì đã cản trở công việc của tôi (Trở ngại)? + * Scrum Master kiểm duyệt và ghi chú [Sprint Impediments](##sprint:scrum_project__version__sprint_1). + * Chủ sở hữu sản phẩm có thể tham gia có thể tham gia để được thông tin. - ### Cuộc họp đánh giá Sprint + ### Họp sơ kết Sprint - _Vui lòng ghi lại các chủ đề của cuộc họp đánh giá Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Sprint Review_ - * Giới hạn thời gian (4 h). - * Tối đa một giờ chuẩn bị cho mỗi người. - * Nhóm trình bày cho chủ sở hữu sản phẩm và các cá nhân quan tâm những gì đã đạt được trong Sprint này. - * Quan trọng: không sử dụng mô hình và PowerPoint! Chỉ nên trình bày chức năng sản phẩm hoàn thiện (Tăng cường) đã được thực hiện. + * Thời gian đóng hộp (4 h). + * Thời gian chuẩn bị tối đa một giờ cho mỗi người. + * Nhóm cho chủ sở hữu sản phẩm và những người quan tâm khác thấy những gì đã đạt được trong lần chạy nước rút này. + * Quan trọng: không có hình nộm và không có PowerPoint! Chức năng của sản phẩm vừa hoàn thiện (Tăng dần) phải được thể hiện. * Phản hồi từ Chủ sở hữu sản phẩm, các bên liên quan và những người khác là mong muốn và sẽ được đưa vào công việc tiếp theo. - * Dựa trên các chức năng đã trình bày, Chủ sở hữu sản phẩm quyết định đưa ra phiên bản này hoặc phát triển nó thêm. Khả năng này cho phép có ROI sớm. + * Dựa trên các chức năng đã được chứng minh, Chủ sở hữu sản phẩm quyết định đưa phần tăng trưởng này vào hoạt động hoặc phát triển thêm. Khả năng này cho phép ROI sớm. - ### Cuộc họp hồi tố Sprint + ### Hồi tưởng nước rút - _Vui lòng ghi lại các chủ đề của cuộc họp hồi tố Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Cải tiến Sprint_ - * Giới hạn thời gian (3 h). - * Sau Cuộc họp đánh giá Sprint, sẽ được điều hành bởi Scrum Master. - * Nhóm thảo luận về Sprint: những gì đã diễn ra tốt, những gì cần cải thiện để trở nên hiệu quả hơn cho Sprint tiếp theo hoặc thậm chí vui vẻ hơn. + * Thời gian đóng khung (3 h). + * Sau Sprint Review, sẽ được Scrum Master kiểm duyệt. + * Nhóm thảo luận về lần chạy nước rút: điều gì đã diễn ra tốt đẹp, điều gì cần được cải thiện để đạt năng suất cao hơn cho lần chạy nước rút tiếp theo hoặc thậm chí có nhiều niềm vui hơn. item_3: - name: Sprint 2 + name: Chạy nước rút 2 categories: - item_0: Danh mục 1 (cần thay đổi trong cài đặt Dự án) + item_0: Loại 1 (sẽ được thay đổi trong cài đặt Dự án) queries: item_0: - name: Kế hoạch dự án + name: kế hoạch dự án item_1: - name: Product backlog + name: Sản phẩm tồn đọng item_2: - name: Sprint 1 + name: Chạy nước rút 1 item_3: name: Nhiệm vụ boards: kanban: - name: Bảng Kanban + name: bảng Kanban basic: name: Bảng nhiệm vụ lists: item_0: - name: Danh sách mong muốn + name: danh sách mong muốn item_1: name: Danh sách ngắn item_2: - name: Danh sách ưu tiên cho hôm nay + name: Danh sách ưu tiên cho ngày hôm nay item_3: - name: Không bao giờ + name: không bao giờ project-overview: widgets: item_0: @@ -313,26 +313,26 @@ vi: options: name: Bắt đầu text: | - Chúng tôi rất vui vì bạn đã tham gia! Chúng tôi khuyên bạn nên thử một vài điều để bắt đầu với OpenProject. + Chúng tôi rất vui vì bạn đã tham gia! Chúng tôi khuyên bạn nên thử một số thứ để bắt đầu trong OpenProject. _Hãy thử các bước sau:_ - 1. *Mời các thành viên mới vào dự án của bạn*: → Đi đến [Thành viên]({{opSetting:base_url}}/projects/your-scrum-project/members) trong điều hướng dự án. - 2. *Xem Danh sách sản phẩm và Danh sách Sprint của bạn*: → Đi đến [Danh sách]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) trong điều hướng dự án. - 3. *Xem Bảng nhiệm vụ của bạn*: → Đi đến [Danh sách]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) → Nhấp vào mũi tên phải trên Sprint → Chọn [Bảng nhiệm vụ](##sprint:scrum_project__version__sprint_1). - 4. *Tạo một gói công việc mới*: → Đi đến [Nhiệm vụ → Tạo]({{opSetting:base_url}}/projects/your-scrum-project/work_packages/new). - 5. *Tạo và cập nhật kế hoạch dự án*: → Đi đến [Kế hoạch dự án](##query:scrum_project__query__project_plan) trong điều hướng dự án. - 6. *Tạo wiki Sprint*: → Đi đến [Danh sách]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và mở wiki sprint từ menu thả xuống bên phải trong một sprint. Bạn có thể chỉnh sửa [mẫu wiki]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) theo nhu cầu của bạn. - 7. *Kích hoạt các mô-đun khác*: → Đi đến [Cài đặt dự án → Mô-đun]({{opSetting:base_url}}/projects/your-scrum-project/settings/modules). + 1. *Mời thành viên mới tham gia dự án của bạn*: → Đi tới [Members]({{opSetting:base_url}}/projects/your-scrum-project/members) trong điều hướng dự án. + 2. *Xem Product backlog và Sprint backlog của bạn*: → Đi đến [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) trong phần điều hướng dự án. + 3. *Xem bảng Nhiệm vụ của bạn*: → Đi tới [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) → Nhấp vào mũi tên phải trên Sprint → Chọn [Task Board](##sprint:scrum_project__version__sprint_1). + 4. *Tạo gói công việc mới*: → Đi tới [Work packages → Create]({{opSetting:base_url}}/projects/your-scrum-project/work_packages/new). + 5. *Tạo và cập nhật kế hoạch dự án*: → Đi tới [Project plan](##query:scrum_project__query__project_plan) trong điều hướng dự án. + 6. *Tạo một wiki Sprint*: → Đi tới [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và mở wiki chạy nước rút từ menu thả xuống bên phải trong một lần chạy nước rút. Bạn có thể chỉnh sửa [wiki template]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) tùy theo nhu cầu của mình. + 7. *Kích hoạt thêm các mô-đun*: → Đi tới [Project settings → Modules]({{opSetting:base_url}}/projects/your-scrum-project/settings/modules). - Tại đây bạn sẽ tìm thấy [Hướng dẫn người dùng](https://www.openproject.org/docs/user-guide/). - Hãy cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ. Liên hệ với chúng tôi: [support[at]openproject.com](mailto:support@openproject.com). + Tại đây bạn sẽ tìm thấy [User Guides](https://www.openproject.org/docs/user-guide/) của chúng tôi. + Vui lòng cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ. Liên hệ với chúng tôi: [support[at]openproject.com](mailto:support@openproject.com). item_5: options: - name: Work Packages + name: Gói công việc item_6: options: - name: Kế hoạch dự án + name: kế hoạch dự án work_packages: item_0: subject: Màn hình đăng nhập mới @@ -342,23 +342,23 @@ vi: subject: Trang web mới children: item_0: - subject: Biểu mẫu đăng ký bản tin + subject: Mẫu đăng ký nhận bản tin item_1: - subject: Triển khai tour sản phẩm + subject: Thực hiện chuyến tham quan sản phẩm item_2: subject: Trang đích mới children: item_0: - subject: Tạo wireframes cho trang đích mới + subject: Tạo wireframe cho trang đích mới item_3: - subject: Biểu mẫu liên hệ + subject: Mẫu liên hệ item_4: - subject: Carousel tính năng + subject: Băng chuyền tính năng children: item_0: - subject: Tạo ảnh chụp màn hình cho tour tính năng + subject: Tạo ảnh chụp màn hình cho chuyến tham quan tính năng item_5: - subject: Màu hover sai + subject: Màu di chuột sai item_6: subject: Chứng chỉ SSL item_7: @@ -385,123 +385,123 @@ vi: item_16: subject: Phát hành v2.0 wiki: | - ### Cuộc họp lập kế hoạch Sprint + ### Họp lập kế hoạch Sprint - _Vui lòng ghi lại các chủ đề của cuộc họp lập kế hoạch Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp lập kế hoạch Sprint_ - * Giới hạn thời gian (8 h) - * Đầu vào: Danh sách sản phẩm - * Đầu ra: Danh sách Sprint + * Thời gian đóng hộp (8 h) + * Đầu vào: Product Backlog + * Đầu ra: Sprint Backlog - * Chia thành hai khoảng thời gian bổ sung 4 h: + * Chia làm 2 ô thời gian bổ sung 4h: - * Chủ sở hữu sản phẩm trình bày [Danh sách sản phẩm]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và các ưu tiên cho nhóm và giải thích Mục tiêu Sprint, mà nhóm phải đồng ý. Cùng nhau, họ ưu tiên các chủ đề từ Danh sách sản phẩm mà nhóm sẽ xử lý trong Sprint tiếp theo. Nhóm cam kết thực hiện các mục tiêu đã thảo luận. - * Nhóm lập kế hoạch độc lập (không có Chủ sở hữu sản phẩm) chi tiết và phân tách các nhiệm vụ từ các yêu cầu đã thảo luận để củng cố một [Danh sách Sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs). + * Chủ sản phẩm trình bày [Product Backlog]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) và các ưu tiên cho nhóm, đồng thời giải thích Mục tiêu Sprint mà nhóm phải đồng ý. Họ cùng nhau ưu tiên các chủ đề trong Product Backlog mà nhóm sẽ xử lý trong lần chạy nước rút tiếp theo. Nhóm cam kết thực hiện việc giao hàng đã thảo luận. + * Nhóm lập kế hoạch một cách tự động (không có Chủ sở hữu sản phẩm) một cách chi tiết và chia nhỏ các nhiệm vụ từ các yêu cầu đã thảo luận để hợp nhất [Sprint Backlog]({{opSetting:base_url}}/projects/your-scrum-project/backlogs). ### Cuộc họp Scrum hàng ngày - _Vui lòng ghi lại các chủ đề của cuộc họp Scrum hàng ngày ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Scrum hàng ngày_ - * Cuộc họp trạng thái ngắn hàng ngày của nhóm. - * Giới hạn thời gian (tối đa 15 phút). - * Cuộc họp đứng để thảo luận các chủ đề sau từ Bảng nhiệm vụ. - * Tôi dự định làm gì cho đến cuộc họp Scrum tiếp theo? - * Điều gì đã cản trở công việc của tôi (Vướng mắc)? - * Scrum Master điều hành và ghi chú các Vướng mắc Sprint. - * Chủ sở hữu sản phẩm có thể tham gia để được thông báo. + * Cuộc họp ngắn, hàng ngày về tình trạng của nhóm. + * Thời gian được đóng khung (tối đa 15 phút). + * Họp độc lập để thảo luận các chủ đề sau từ Ban công tác. + * Tôi dự định làm gì cho đến buổi Daily Scrum tiếp theo? + * Điều gì đã cản trở công việc của tôi (Trở ngại)? + * Scrum Master kiểm duyệt và ghi lại các Trở ngại trong Sprint. + * Chủ sở hữu sản phẩm có thể tham gia có thể tham gia để được thông tin. - ### Cuộc họp đánh giá Sprint + ### Họp sơ kết Sprint - _Vui lòng ghi lại các chủ đề của cuộc họp đánh giá Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Sprint Review_ - * Giới hạn thời gian (4 h). - * Tối đa một giờ chuẩn bị cho mỗi người. - * Nhóm trình bày cho chủ sở hữu sản phẩm và các cá nhân quan tâm những gì đã đạt được trong Sprint này. - * Quan trọng: không sử dụng mô hình và PowerPoint! Chỉ nên trình bày chức năng sản phẩm hoàn thiện (Tăng cường) đã được thực hiện. + * Thời gian đóng hộp (4 h). + * Thời gian chuẩn bị tối đa một giờ cho mỗi người. + * Nhóm cho chủ sở hữu sản phẩm và những người quan tâm khác thấy những gì đã đạt được trong lần chạy nước rút này. + * Quan trọng: không có hình nộm và không có PowerPoint! Chức năng của sản phẩm vừa hoàn thiện (Tăng dần) phải được thể hiện. * Phản hồi từ Chủ sở hữu sản phẩm, các bên liên quan và những người khác là mong muốn và sẽ được đưa vào công việc tiếp theo. - * Dựa trên các chức năng đã trình bày, Chủ sở hữu sản phẩm quyết định đưa ra phiên bản này hoặc phát triển nó thêm. Khả năng này cho phép có ROI sớm. + * Dựa trên các chức năng đã được chứng minh, Chủ sở hữu sản phẩm quyết định đưa phần tăng trưởng này vào hoạt động hoặc phát triển thêm. Khả năng này cho phép ROI sớm. - ### Cuộc họp hồi tố Sprint + ### Hồi tưởng nước rút - _Vui lòng ghi lại các chủ đề của cuộc họp hồi tố Sprint ở đây_ + _Vui lòng ghi lại các chủ đề ở đây cho cuộc họp Cải tiến Sprint_ - * Giới hạn thời gian (3 h). - * Sau Cuộc họp đánh giá Sprint, sẽ được điều hành bởi Scrum Master. - * Nhóm thảo luận về Sprint: những gì đã diễn ra tốt, những gì cần cải thiện để trở nên hiệu quả hơn cho Sprint tiếp theo hoặc thậm chí vui vẻ hơn. + * Thời gian đóng khung (3 h). + * Sau Sprint Review, sẽ được Scrum Master kiểm duyệt. + * Nhóm thảo luận về lần chạy nước rút: điều gì đã diễn ra tốt đẹp, điều gì cần được cải thiện để đạt năng suất cao hơn cho lần chạy nước rút tiếp theo hoặc thậm chí có nhiều niềm vui hơn. statuses: item_0: name: Mới item_1: - name: Trong quá trình đặc tả + name: Trong đặc điểm kỹ thuật item_2: name: được chỉ định item_3: - name: Đã xác nhận + name: xác nhận item_4: - name: Sẽ được xếp lịch + name: Để được lên lịch item_5: - name: Đã xếp lịch + name: theo lịch trình item_6: name: Đang xử lý item_7: name: Đã phát triển item_8: - name: Trong quá trình thử nghiệm + name: Trong thử nghiệm item_9: - name: Đã kiểm tra + name: Đã thử nghiệm item_10: - name: Kiểm tra thất bại + name: Kiểm tra không thành công item_11: - name: Đã đóng + name: đóng cửa item_12: name: Đang chờ item_13: name: Đã từ chối time_entry_activities: item_0: - name: Quản lý + name: quản lý item_1: name: Đặc điểm kỹ thuật item_2: - name: Phát triển + name: phát triển item_3: - name: Thử nghiệm + name: thử nghiệm item_4: - name: Hỗ trợ + name: hỗ trợ item_5: - name: Khác + name: khác types: item_0: name: Nhiệm vụ item_1: - name: Milestone + name: cột mốc quan trọng item_2: - name: Summary task + name: Nhiệm vụ tóm tắt item_3: - name: Tính năng + name: tính năng item_4: name: Sử thi item_5: - name: Câu chuyện người dùng + name: Cốt truyện người dùng item_6: - name: Lỗi + name: lỗi welcome: title: Chào mừng đến với OpenProject! text: | - OpenProject là phần mềm quản lý dự án mã nguồn mở hàng đầu. Nó hỗ trợ quản lý dự án theo cách truyền thống, Agile cũng như kết hợp và cung cấp cho bạn toàn quyền kiểm soát dữ liệu của mình. + OpenProject là phần mềm quản lý dự án nguồn mở hàng đầu. Nó hỗ trợ quản lý dự án cổ điển, linh hoạt cũng như kết hợp và cung cấp cho bạn toàn quyền kiểm soát dữ liệu của mình. - Các tính năng và trường hợp sử dụng chính: + Các tính năng cốt lõi và trường hợp sử dụng: - * [Quản lý danh mục dự án](https://www.openproject.org/collaboration-software-features/project-portfolio-management/) - * [Lập kế hoạch và lên lịch dự án](https://www.openproject.org/collaboration-software-features/project-planning-scheduling/) - * [Quản lý nhiệm vụ và theo dõi sự cố](https://www.openproject.org/collaboration-software-features/task-management/) - * [Bảng Agile (Scrum và Kanban)](https://www.openproject.org/collaboration-software-features/agile-project-management/) - * [Quản lý yêu cầu và lập kế hoạch phát hành](https://www.openproject.org/collaboration-software-features/product-development/) - * [Theo dõi thời gian và chi phí, Ngân sách](https://www.openproject.org/collaboration-software-features/time-tracking/) - * [Hợp tác nhóm và Tài liệu](https://www.openproject.org/collaboration-software-features/team-collaboration/) + * [Project Portfolio Management](https://www.openproject.org/collaboration-software-features/project-portfolio-management/) + * [Project Planning and Scheduling](https://www.openproject.org/collaboration-software-features/project-planning-scheduling/) + * [Task Management and Issue Tracking](https://www.openproject.org/collaboration-software-features/task-management/) + * [Agile Boards (Scrum and Kanban)](https://www.openproject.org/collaboration-software-features/agile-project-management/) + * [Requirements Management and Release Planning](https://www.openproject.org/collaboration-software-features/product-development/) + * [Time and Cost Tracking, Budgets](https://www.openproject.org/collaboration-software-features/time-tracking/) + * [Team Collaboration and Documentation](https://www.openproject.org/collaboration-software-features/team-collaboration/) Chào mừng bạn đến với tương lai của quản lý dự án. - Đối với quản trị viên: Bạn có thể thay đổi văn bản chào mừng này [tại đây]({{opSetting:base_url}}/admin/settings/general). + Dành cho Quản trị viên: Bạn có thể thay đổi văn bản chào mừng này [here]({{opSetting:base_url}}/admin/settings/general). diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 7f74277062b..1d7850c8dcc 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -26,28 +26,28 @@ vi: no_results_title_text: Đã không có bất kỳ hoạt động nào cho dự án trong khung thời gian này. work_packages: activity_tab: - no_results_title_text: Không hiện hoạt động nào - no_results_description_text: 'Chọn "Hiện mọi thứ" để hiện tất cả các hoạt động và bình luận' - label_activity_show_all: "Hiện mọi thứ" - label_activity_show_only_comments: "Chỉ hiện bình luận" - label_activity_show_only_changes: "Chỉ hiện thay đổi" - label_sort_asc: "Newest at the bottom" - label_sort_desc: "Newest on top" - label_type_to_comment: "Add a comment. Type @ to notify people." - label_submit_comment: "Submit comment" - label_who: Who? - changed_on: "changed on" - created_on: "created this on" - changed: "changed" - created: "created" - commented: "commented" - internal_comment: ghi chú nội bộ - internal_journal: Internal comments are visible to a limited group of members. - unsaved_changes_confirmation_message: You have unsaved changes. Are you sure you want to close the editor? + no_results_title_text: Không có hoạt động nào để hiển thị + no_results_description_text: 'Chọn "Hiển thị mọi thứ" để hiển thị tất cả hoạt động và nhận xét' + label_activity_show_all: "Hiển thị mọi thứ" + label_activity_show_only_comments: "Chỉ hiển thị nhận xét" + label_activity_show_only_changes: "Chỉ hiển thị các thay đổi" + label_sort_asc: "Mới nhất ở phía dưới" + label_sort_desc: "Mới nhất ở trên cùng" + label_type_to_comment: "Thêm một bình luận. Nhập @ để thông báo cho mọi người." + label_submit_comment: "Gửi bình luận" + label_who: Ai? + changed_on: "đã thay đổi" + created_on: "đã tạo cái này trên" + changed: "đã thay đổi" + created: "đã tạo" + commented: "Đã bình luận" + internal_comment: Bình luận nội bộ + internal_journal: Nhận xét nội bộ được hiển thị cho một nhóm thành viên hạn chế. + unsaved_changes_confirmation_message: Bạn có những thay đổi chưa được lưu. Bạn có chắc chắn muốn đóng trình chỉnh sửa không? internal_comment_confirmation: - title: "Make this comment public?" - heading: "Make this comment public?" - description: "Your comment will be visible to anyone who can access this work package. Are you sure you want to do this?" + title: "Công khai nhận xét này?" + heading: "Công khai nhận xét này?" + description: "Nhận xét của bạn sẽ hiển thị với bất kỳ ai có thể truy cập gói công việc này. Bạn có chắc chắn muốn làm điều này?" confirm_button_text: "Công khai" admin: plugins: @@ -56,157 +56,174 @@ vi: custom_styles: color_theme: "Màu sắc giao diện" color_theme_custom: "(Tùy chỉnh)" - tab_interface: "Interface" - tab_branding: "Branding" - tab_pdf_export_styles: "PDF export styles" - tab_pdf_export_font: "PDF export font" + tab_interface: "Giao diện" + tab_branding: "Xây dựng thương hiệu" + tab_pdf_export_styles: "Kiểu xuất PDF" + tab_pdf_export_font: "Phông chữ xuất PDF" fonts: - file_too_large: "is too large (maximum size is %{count} MB)." - file_is_invalid: "is not a valid TTF font file." + file_too_large: "quá lớn (kích thước tối đa là %{count} MB)." + file_is_invalid: "không phải là tệp phông chữ TTF hợp lệ." colors: primary-button-color: "Nút chính" - accent-color: "Nhấn mạnh" + accent-color: "Màu nhấn" header-bg-color: "Nền của tiêu đề" main-menu-bg-color: "Nền menu chính" main-menu-bg-selected-background: "Menu chính khi được chọn" custom_colors: "Tùy chỉnh màu sắc" manage_colors: "Chỉnh sửa màu sắc trong select option" instructions: - primary-button-color: "Màu nhấn mạnh mạnh, được sử dụng cho nút quan trọng nhất trên màn hình." - accent-color: "Màu cho các liên kết và các yếu tố được nhấn mạnh nhẹ nhàng khác." + primary-button-color: "Màu nhấn mạnh, được sử dụng cho nút quan trọng nhất trên màn hình." + accent-color: "Màu sắc cho các liên kết và các yếu tố được đánh dấu rõ ràng khác." main-menu-bg-color: "Màu nền của trình đơn ở bên trái." theme_warning: Thay đổi chủ đề sẽ ghi đè phong cách tùy chỉnh của bạn. Thiết kế sau đó sẽ bị mất. Bạn có chắc chắn muốn tiếp tục không? enterprise: delete_dialog: - title: "Delete enterprise token" - heading: "Delete this enterprise token?" - confirmation: "Are you sure you want to delete this Enterprise edition support token?" + title: "Xóa mã thông báo doanh nghiệp" + heading: "Xóa mã thông báo doanh nghiệp này?" + confirmation: "Bạn có chắc chắn muốn xóa mã thông báo hỗ trợ phiên bản Doanh nghiệp này không?" create_dialog: - title: "Add Enterprise token" - type_token_text: "Type support token text" - token_placeholder: "Paste your Enterprise edition support token here" - add_token: "Tải lên mã hỗ trợ phiên bản Enterprise" + title: "Thêm mã thông báo doanh nghiệp" + type_token_text: "Nhập văn bản mã thông báo hỗ trợ" + token_placeholder: "Dán mã thông báo hỗ trợ phiên bản Enterprise của bạn vào đây" + add_token: "Tải lên mã thông báo hỗ trợ phiên bản Enterprise" replace_token: "Thay thế support token hiện tại của bạn" - order: "Đặt hàng phiên bản Enterprise on-premises" - paste: "Dán mã hỗ trợ phiên bản Enterprise của bạn" - required_for_feature: "Tiện ích này chỉ có sẵn với mã hỗ trợ phiên bản Enterprise đang hoạt động." + order: "Đặt mua phiên bản tại chỗ của Enterprise" + paste: "Dán mã thông báo hỗ trợ phiên bản Enterprise của bạn" + required_for_feature: "Tiện ích bổ sung này chỉ khả dụng với mã thông báo hỗ trợ phiên bản Doanh nghiệp đang hoạt động." enterprise_link: "Thêm thông tin, nhấn vào đây." start_trial: "Bắt đầu dùng thử miễn phí" book_now: "Đặt chỗ ngay" get_quote: "Lấy trích dẫn" buttons: - upgrade: "Nâng cấp ngay" - contact: "Liên hệ với chúng tôi để được trình diễn" + upgrade: "Nâng cấp ngay bây giờ" + contact: "Liên hệ với chúng tôi để có bản demo" status: - expired: "Expired" - expiring_soon: "Expiring soon" - in_grace_period: "In grace period" - invalid_domain: "Invalid domain" - not_active: "Not active" - trial: "Trial" - jemalloc_allocator: Jemalloc memory allocator + expired: "hết hạn" + expiring_soon: "Sắp hết hạn" + in_grace_period: "Đang trong thời gian ân hạn" + invalid_domain: "Tên miền không hợp lệ" + not_active: "Không hoạt động" + trial: "thử nghiệm" + jemalloc_allocator: Bộ cấp phát bộ nhớ Jemalloc journal_aggregation: explanation: - text: "Các hành động cá nhân của người dùng (ví dụ: cập nhật một công việc hai lần) được gộp thành một hành động nếu thời gian chênh lệch giữa chúng nhỏ hơn khoảng thời gian được chỉ định. Chúng sẽ được hiển thị dưới dạng một hành động duy nhất trong ứng dụng. Điều này cũng sẽ trì hoãn thông báo cùng một khoảng thời gian giảm số lượng email được gửi và cũng sẽ ảnh hưởng đến độ trễ %{webhook_link}." + text: "Các hành động riêng lẻ của người dùng (ví dụ: cập nhật gói công việc hai lần) được tổng hợp thành một hành động nếu chênh lệch tuổi tác của họ nhỏ hơn khoảng thời gian đã chỉ định. Chúng sẽ được hiển thị dưới dạng một hành động duy nhất trong ứng dụng. Điều này cũng sẽ làm chậm thông báo với cùng một khoảng thời gian làm giảm số lượng email được gửi và cũng sẽ ảnh hưởng đến độ trễ %{webhook_link}." link: "webhook" + mcp_configurations: + index: + description: "Giao thức bối cảnh mô hình cho phép các tác nhân AI cung cấp cho người dùng của mình các công cụ và tài nguyên được cung cấp bởi phiên bản OpenProject này." + resources_heading: "Tài nguyên" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Cập nhật tài nguyên" + tools_heading: "Công cụ" + tools_description: "OpenProject cung cấp các công cụ sau đây. Mỗi công cụ có thể được kích hoạt, đổi tên và mô tả theo ý muốn của bạn. Để biết thêm thông tin, vui lòng tham khảo [tài liệu về các công cụ MCP](docs_url)." + tools_submit: "Cập nhật công cụ" + multi_update: + success: "Cấu hình MCP đã được cập nhật thành công." + server_form: + description_caption: "Cách máy chủ MCP sẽ được mô tả cho các ứng dụng khác kết nối với nó." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "Không thể cập nhật cấu hình MCP." + success: "Cấu hình MCP đã được cập nhật thành công." scim_clients: authentication_methods: - sso: "JWT from identity provider" - oauth2_client: "OAuth 2.0 client credentials" - oauth2_token: "Static access token" + sso: "JWT từ nhà cung cấp danh tính" + oauth2_client: "Thông tin xác thực ứng dụng khách OAuth 2.0" + oauth2_token: "Mã thông báo truy cập tĩnh" created_client_credentials_dialog_component: - title: "Client credentials created" - heading: "Client credentials have been generated" - one_time_hint: "This is the only time you will see the client secret. Make sure to copy it now." + title: "Đã tạo thông tin xác thực của khách hàng" + heading: "Thông tin xác thực của khách hàng đã được tạo" + one_time_hint: "Đây là lần duy nhất bạn sẽ nhìn thấy bí mật của khách hàng. Hãy chắc chắn để sao chép nó ngay bây giờ." created_token_dialog_component: - title: "Token created" - heading: "A token has been generated" - label_token: "Token" - one_time_hint: "This is the only time you will see this token. Make sure to copy it now." + title: "Đã tạo mã thông báo" + heading: "Một mã thông báo đã được tạo" + label_token: "mã thông báo" + one_time_hint: "Đây là lần duy nhất bạn sẽ thấy mã thông báo này. Hãy chắc chắn để sao chép nó ngay bây giờ." delete_scim_client_dialog_component: - title: "Delete SCIM client" - heading: "Are you sure you want to delete this SCIM client?" - description: "Users managed by this SCIM client can no longer be updated by it." + title: "Xóa ứng dụng khách SCIM" + heading: "Bạn có chắc chắn muốn xóa ứng dụng khách SCIM này không?" + description: "Người dùng được quản lý bởi ứng dụng khách SCIM này không thể được nó cập nhật nữa." edit: - label_delete_scim_client: "Delete SCIM client" + label_delete_scim_client: "Xóa ứng dụng khách SCIM" form: - auth_provider_description: "This is the service that users added by the SCIM provider will use to authenticate in OpenProject." - authentication_method_description_html: "This is how the SCIM client authenticates at OpenProject. Please ensure that OAuth tokens include the scim_v2 scope." - description: "Please refer to our [documentation on configuring SCIM clients](docs_url) for more information on these configuration options." - jwt_sub_description: "For example, for Keycloak, this is the UUID of the service account associated with the SCIM client. Consult [our documentation](docs_url) to learn how to find the subject claim for your use case." - name_description: "Choose a name that will help other admins better understand why this client was configured." + auth_provider_description: "Đây là dịch vụ mà người dùng được nhà cung cấp SCIM thêm vào sẽ sử dụng để xác thực trong OpenProject." + authentication_method_description_html: "Đây là cách ứng dụng khách SCIM xác thực tại OpenProject. Vui lòng đảm bảo rằng mã thông báo OAuth bao gồm phạm vi scim_v2." + description: "Vui lòng tham khảo [documentation on configuring SCIM clients](docs_url) của chúng tôi để biết thêm thông tin về các tùy chọn cấu hình này." + jwt_sub_description: "Ví dụ: đối với Keycloak, đây là UUID của tài khoản dịch vụ được liên kết với máy khách SCIM. Hãy tham khảo [our documentation](docs_url) để tìm hiểu cách tìm xác nhận quyền sở hữu chủ đề cho trường hợp sử dụng của bạn." + name_description: "Chọn một tên sẽ giúp các quản trị viên khác hiểu rõ hơn lý do tại sao ứng dụng khách này được định cấu hình." index: - description: "SCIM clients configured here are able to interact with OpenProject SCIM server API to provision, update, and deprovision user accounts and groups." - label_create_button: "Add SCIM client" + description: "Các máy khách SCIM được định cấu hình ở đây có thể tương tác với API máy chủ OpenProject SCIM để cung cấp, cập nhật và hủy cấp phép các tài khoản và nhóm người dùng." + label_create_button: "Thêm ứng dụng khách SCIM" new: - title: "New SCIM client" + title: "Khách hàng SCIM mới" revoke_static_token_dialog_component: confirm_button: "Thu hồi" - title: "Revoke static token" - heading: "Bạn có chắc chắn muốn thu hồi mã truy cập này không?" - description: "The SCIM client that uses this token will no longer be able to access OpenProject's SCIM server API." + title: "Thu hồi mã thông báo tĩnh" + heading: "Bạn có chắc chắn muốn thu hồi mã thông báo này không?" + description: "Ứng dụng khách SCIM sử dụng mã thông báo này sẽ không thể truy cập API máy chủ SCIM của OpenProject nữa." table_component: blank_slate: - title: "No SCIM clients configured yet" - description: "Add clients to see them here" - user_count: "Người dùng" + title: "Chưa có máy khách SCIM nào được định cấu hình" + description: "Thêm khách hàng để xem họ ở đây" + user_count: "người dùng" token_list_component: - description: "The tokens you generate here can be passed by a SCIM client to access the OpenProject SCIM API." - heading: "Tokens" - label_add_token: "Token" - label_aria_add_token: "Add token" + description: "Mã thông báo bạn tạo ở đây có thể được máy khách SCIM chuyển để truy cập API OpenProject SCIM." + heading: "mã thông báo" + label_add_token: "mã thông báo" + label_aria_add_token: "Thêm mã thông báo" token_table_component: blank_slate: - title: "No tokens have been created yet" - description: "You can create one now" - expired: "Expired on %{date}" - revoked: "Revoked on %{date}" - title: "Access token table" + title: "Chưa có mã thông báo nào được tạo" + description: "Bạn có thể tạo một cái ngay bây giờ" + expired: "Đã hết hạn vào %{date}" + revoked: "Đã thu hồi vào %{date}" + title: "Bảng mã thông báo truy cập" settings: new_project: - project_creation: "Project creation" + project_creation: "Tạo dự án" notification_text_default: > -

    Hello,

    A new project has been created: projectValue:name

    Thank you

    +

    Xin chào,

    Một dự án mới đã được tạo: projectValue:name

    Thank you

    workflows: tabs: - default_transitions: "Default transitions" - user_author: "User is author" - user_assignee: "User is assignee" + default_transitions: "Chuyển tiếp mặc định" + user_author: "Người dùng là tác giả" + user_assignee: "Người dùng là người được chuyển nhượng" authentication: - login_and_registration: "Login and registration" + login_and_registration: "Đăng nhập và đăng ký" announcements: show_until: Xem đến khi is_active: Đang hiển thị is_inactive: hiện tại không hiển thị antivirus_scan: - not_processed_yet_message: "Tải xuống bị chặn, vì tệp chưa được quét virus. Vui lòng thử lại sau." - quarantined_message: "Phát hiện virus trong tệp '%{filename}'. Tệp đã bị cách ly và không thể tải xuống." - deleted_message: "Phát hiện virus trong tệp '%{filename}'. Tệp đã bị xóa." - deleted_by_admin: "Tệp cách ly '%{filename}' đã bị quản trị viên xóa." - overridden_by_admin: "Lệnh cách ly cho tệp '%{filename}' đã bị %{user} hủy bỏ. Tệp hiện có thể truy cập được." + not_processed_yet_message: "Quá trình tải xuống bị chặn do tệp chưa được quét vi-rút. Vui lòng thử lại sau." + quarantined_message: "Đã phát hiện thấy vi-rút trong tệp '%{filename}'. Nó đã bị cách ly và không có sẵn để tải xuống." + deleted_message: "Đã phát hiện thấy vi-rút trong tệp '%{filename}'. Tập tin đã bị xóa." + deleted_by_admin: "Tệp bị cách ly '%{filename}' đã bị quản trị viên xóa." + overridden_by_admin: "Việc cách ly tệp '%{filename}' đã bị %{user} xóa. Bây giờ tập tin có thể được truy cập." quarantined_attachments: - container: "Bộ chứa" - delete: "Xóa tệp cách ly" - title: "Tệp đính kèm cách ly" - error_cannot_act_self: "Không thể thực hiện hành động trên các tệp bạn đã tải lên." + container: "container" + delete: "Xóa tập tin bị cách ly" + title: "Tệp đính kèm được cách ly" + error_cannot_act_self: "Không thể thực hiện hành động trên các tệp đã tải lên của riêng bạn." attribute_help_texts: - caption: "This short version will be displayed as caption of the attribute." - note_public: "Any text and images you add to this field are publicly visible to all logged in users." + caption: "Phiên bản ngắn này sẽ được hiển thị dưới dạng chú thích của thuộc tính." + note_public: "Mọi văn bản và hình ảnh bạn thêm vào trường này đều hiển thị công khai với tất cả người dùng đã đăng nhập." text_overview: "Tại đây, bạn có thể tạo các văn bản hiển thị hỗ trợ. Khi hoàn thành, các văn bản có thể được hiển thị bằng cách nhấp vào biểu tượng trợ giúp bên cạnh các giá trị." show_preview: "Văn bản xem trước" add_new: "Thêm văn bản trợ giúp" - edit_field_name: "Edit help text for %{attribute_field_name}" + edit_field_name: "Chỉnh sửa văn bản trợ giúp cho %{attribute_field_name}" background_jobs: status: - error_requeue: "Công việc gặp lỗi nhưng đang thử lại. Lỗi là: %{message}" + error_requeue: "Công việc đã gặp lỗi nhưng đang thử lại. Lỗi là: %{message}" cancelled_due_to: "Công việc bị hủy do lỗi: %{message}" ldap_auth_sources: ldap_error: "Lỗi LDAP: %{error_message}" - ldap_auth_failed: "Không thể xác thực tại máy chủ LDAP." + ldap_auth_failed: "Không thể xác thực tại Máy chủ LDAP." sync_failed: "Không thể đồng bộ hóa từ LDAP: %{message}." - back_to_index: "Nhấp vào đây để quay lại danh sách kết nối." + back_to_index: "Bấm vào đây để quay lại danh sách kết nối." technical_warning: | - This LDAP form requires technical knowledge of your LDAP / Active Directory setup. + Biểu mẫu LDAP này yêu cầu kiến ​​thức kỹ thuật về thiết lập LDAP/Active Directory của bạn. [Please visit our documentation for detailed instructions](docs_url). attribute_texts: name: Tên tùy ý của kết nối LDAP @@ -215,55 +232,55 @@ vi: generic_map: "84/5000\nKhóa thuộc tính trong LDAP được ánh xạ tới thuộc tính `%{attribute}` của OpenProject" admin_map_html: "Tùy chọn: Khóa thuộc tính trong LDAP mà nếu có đánh dấu người dùng OpenProject là quản trị viên. Để trống khi nghi ngờ." system_user_dn_html: | - Enter the DN of the system user used for read-only access. + Nhập DN của người dùng hệ thống được sử dụng để truy cập chỉ đọc.
    - Example: uid=openproject,ou=system,dc=example,dc=com + Ví dụ: uid=openproject,ou=system,dc=example,dc=com system_user_password: Nhập mật khẩu liên kết của người dùng hệ thống base_dn: | Nhập Base DN của cây con trong LDAP mà bạn muốn OpenProject tìm kiếm người dùng và nhóm. - OpenProject sẽ chỉ lọc các tên người dùng được cung cấp trong cây con này. + OpenProject sẽ chỉ lọc tên người dùng được cung cấp trong cây con này. Ví dụ: ou=users,dc=example,dc=com filter_string: | - Thêm bộ lọc RFC4515 tùy chọn để áp dụng cho các kết quả trả về cho người dùng được lọc trong LDAP. - Điều này có thể được sử dụng để giới hạn tập hợp người dùng được OpenProject tìm thấy để xác thực và đồng bộ hóa nhóm. + Thêm bộ lọc RFC4515 tùy chọn để áp dụng cho kết quả trả về cho người dùng được lọc trong LDAP. + Điều này có thể được sử dụng để hạn chế nhóm người dùng được OpenProject tìm thấy để xác thực và đồng bộ hóa nhóm. filter_string_concat: | OpenProject sẽ luôn lọc thuộc tính đăng nhập do người dùng cung cấp để xác định bản ghi. Nếu bạn cung cấp bộ lọc ở đây, - nó sẽ được kết hợp với một AND. Theo mặc định, một bộ lọc catch-all (objectClass=*) sẽ được sử dụng. + nó sẽ được nối với AND. Theo mặc định, tổng hợp (objectClass=*) sẽ được sử dụng làm bộ lọc. onthefly_register: | - Nếu bạn chọn hộp này, OpenProject sẽ tự động tạo người dùng mới từ các mục nhập LDAP của họ - khi họ lần đầu tiên xác thực với OpenProject. - Để trống để chỉ cho phép các tài khoản hiện có trong OpenProject xác thực thông qua LDAP! + Nếu bạn chọn hộp này, OpenProject sẽ tự động tạo người dùng mới từ các mục LDAP của họ + khi họ xác thực lần đầu bằng OpenProject. + Bỏ chọn mục này để chỉ cho phép các tài khoản hiện có trong OpenProject xác thực thông qua LDAP! connection_encryption: "Mã hóa kết nối" encryption_details: "Tùy chọn LDAPS / STARTTLS" system_account: "Tài khoản hệ thống" system_account_legend: | - OpenProject yêu cầu truy cập chỉ đọc thông qua tài khoản hệ thống để tra cứu người dùng và nhóm trong cây LDAP của bạn. - Vui lòng chỉ định thông tin đăng nhập liên kết cho người dùng hệ thống đó trong phần sau. + OpenProject yêu cầu quyền truy cập chỉ đọc thông qua tài khoản hệ thống để tra cứu người dùng và nhóm trong cây LDAP của bạn. + Vui lòng chỉ định thông tin xác thực liên kết cho người dùng hệ thống đó trong phần sau. ldap_details: "Chi tiết LDAP " user_settings: "Ánh xạ thuộc tính" user_settings_legend: | Các trường sau đây liên quan đến cách người dùng được tạo trong OpenProject từ các mục nhập LDAP và - các thuộc tính LDAP nào được sử dụng để xác định các thuộc tính của người dùng OpenProject (ánh xạ thuộc tính). + thuộc tính LDAP nào được sử dụng để xác định thuộc tính của người dùng OpenProject (ánh xạ thuộc tính). tls_mode: - plain: "không" + plain: "không có" simple_tls: "LDAPS" - start_tls: "STARTTLS" - plain_description: "Mở kết nối không mã hóa đến máy chủ LDAP. Không khuyến khích cho môi trường sản xuất." - simple_tls_description: "Sử dụng LDAPS. Yêu cầu một cổng riêng trên máy chủ LDAP. Chế độ này thường bị loại bỏ, chúng tôi khuyến nghị sử dụng STARTTLS bất cứ khi nào có thể." - start_tls_description: "Gửi lệnh STARTTLS sau khi kết nối với cổng LDAP chuẩn. Được khuyến nghị cho kết nối mã hóa." + start_tls: "BẮT ĐẦU" + plain_description: "Mở kết nối không được mã hóa đến máy chủ LDAP. Không được khuyến khích cho sản xuất." + simple_tls_description: "Sử dụng LDAPS. Yêu cầu một cổng riêng trên máy chủ LDAP. Chế độ này thường không được dùng nữa, chúng tôi khuyên bạn nên sử dụng STARTTLS bất cứ khi nào có thể." + start_tls_description: "Gửi lệnh STARTTLS sau khi kết nối với cổng LDAP tiêu chuẩn. Được khuyến nghị cho các kết nối được mã hóa." section_more_info_link_html: > Phần này liên quan đến bảo mật kết nối của nguồn xác thực LDAP này. Để biết thêm thông tin, vui lòng truy cập tài liệu Net::LDAP. tls_options: verify_peer: "Xác minh chứng chỉ SSL" verify_peer_description_html: > - Enables strict SSL verification of the certificate trusted chain.
    Warning: Unchecking this option disables SSL verification of the LDAP server certificate. This exposes your connection to Man in the Middle attacks. - tls_certificate_description: "Nếu chứng chỉ máy chủ LDAP không có trong nguồn tin cậy của hệ thống này, bạn có thể thêm nó thủ công ở đây. Nhập chuỗi chứng chỉ PEM X509." + Cho phép xác minh SSL nghiêm ngặt của chuỗi chứng chỉ tin cậy.
    Cảnh báo: Việc bỏ chọn tùy chọn này sẽ tắt xác minh SSL của chứng chỉ máy chủ LDAP. Điều này làm lộ mối liên hệ của bạn với các cuộc tấn công của Man in the Middle. + tls_certificate_description: "Nếu chứng chỉ máy chủ LDAP không có trong các nguồn tin cậy của hệ thống này, bạn có thể thêm chứng chỉ đó theo cách thủ công tại đây. Nhập chuỗi chứng chỉ PEM X509." forums: show: no_results_title_text: Hiện tại không có bài viết cho diễn đàn. colors: index: - no_results_title_text: Hiện có không có màu sắc. + no_results_title_text: Hiện tại không có màu sắc. no_results_content_text: Tạo một màu mới label_new_color: "Màu mới" new: @@ -276,13 +293,13 @@ vi: label_no_color: "Không màu" label_properties: "Thuộc tính" label_really_delete_color: > - Bạn có chắc chắn muốn xóa màu sau không? Các loại sử dụng màu này sẽ không bị xóa. + Bạn có chắc chắn muốn xóa màu sau đây không? Những loại sử dụng màu này sẽ không bị xóa. custom_actions: actions: name: "Hành động" add: "Thêm hành động" assigned_to: - executing_user_value: "(Chỉ định cho người thực hiện)" + executing_user_value: "(Gán cho người dùng thực thi)" conditions: "Điều kiện" plural: "Tác vụ tùy chỉnh" new: "Hành động tùy chỉnh mới" @@ -292,166 +309,166 @@ vi: admin: custom_field_projects: is_for_all_blank_slate: - heading: Cho tất cả các dự án - description: This custom field is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + heading: Đối với tất cả các dự án + description: Trường tùy chỉnh này được bật trong tất cả các dự án vì tùy chọn "Dành cho tất cả dự án" được chọn. Nó không thể bị vô hiệu hóa đối với các dự án riêng lẻ. items: - actions: "Item actions" + actions: "Hành động mục" blankslate: root: - title: "Your list of items is empty" - description: "Start by adding items to the custom field of type hierarchy. Each item can be used to create a hierarchy bellow it. To navigate and create sub-items inside a hierarchy click on the created item." + title: "Danh sách các mục của bạn trống" + description: "Bắt đầu bằng cách thêm các mục vào trường tùy chỉnh của hệ thống phân cấp loại. Mỗi mục có thể được sử dụng để tạo một hệ thống phân cấp bên dưới nó. Để điều hướng và tạo các mục con bên trong hệ thống phân cấp, hãy nhấp vào mục đã tạo." item: - title: This item doesn't have any hierarchy level below - description: Add items to this list to create sub-items inside another one + title: Mục này không có bất kỳ cấp độ phân cấp nào dưới đây + description: Thêm các mục vào danh sách này để tạo các mục con bên trong một mục khác delete_dialog: - title: "Delete custom field item" - heading: "Delete custom field item?" - description: "This action will irreversibly remove the item and all its sub-items. Any assigned values will be permanently deleted. If this field is required, removing items may cause existing work packages to become invalid." + title: "Xóa mục trường tùy chỉnh" + heading: "Xóa mục trường tùy chỉnh?" + description: "Hành động này sẽ xóa mục này và tất cả các mục phụ của nó mà không thể đảo ngược được. Mọi giá trị được chỉ định sẽ bị xóa vĩnh viễn. Nếu trường này là bắt buộc, việc xóa các mục có thể khiến các gói công việc hiện có trở nên không hợp lệ." placeholder: - label: "Item label" - short: "Short name" - weight: "Weight" + label: "Nhãn mặt hàng" + short: "Tên viết tắt" + weight: "cân nặng" notice: - remember_items_and_projects: "Remember to set items and projects in the respective tabs for this custom field." + remember_items_and_projects: "Hãy nhớ đặt các mục và dự án trong các tab tương ứng cho trường tùy chỉnh này." hierarchy: subitems: - zero: no sub-items - one: 1 sub-item - other: "%{count} sub-items" + zero: không có mục phụ + one: 1 mục phụ + other: "%{count} mục phụ" role_assignment: - title: Role Assignment - description: You can automatically grant a certain project role to any user assigned to this project attribute, regardless of that user’s original role in that project. - warning: Depending on the role selected below, the user assigned to this project attribute might gain significantly more permissions than they previously had, including the ability to add new members and elevate their role. - role_field_label: "Project Role" - role_field_caption: This project role will automatically be granted to any user assigned to this project attribute + title: Phân công vai trò + description: Bạn có thể tự động cấp một vai trò dự án nhất định cho bất kỳ người dùng nào được gán cho thuộc tính dự án này, bất kể vai trò ban đầu của người dùng đó trong dự án đó là gì. + warning: Tùy thuộc vào vai trò được chọn bên dưới, người dùng được chỉ định cho thuộc tính dự án này có thể nhận được nhiều quyền hơn đáng kể so với trước đây, bao gồm khả năng thêm thành viên mới và nâng cao vai trò của họ. + role_field_label: "Vai trò dự án" + role_field_caption: Vai trò dự án này sẽ tự động được cấp cho bất kỳ người dùng nào được chỉ định cho thuộc tính dự án này review_hint: > - There are %{user_count} who are already assigned to this project attribute in various projects. They might get additional permissions and be added to projects they did not previously have access to. - review_button: Review users and permissions + Có %{user_count} người đã được gán cho thuộc tính dự án này trong nhiều dự án khác nhau. Họ có thể nhận được các quyền bổ sung và được thêm vào các dự án mà trước đây họ không có quyền truy cập. + review_button: Xem lại người dùng và quyền dialog: - title: "Overview of users and permissions" - change: Change + title: "Tổng quan về người dùng và quyền" + change: thay đổi changes: - new_member: Will be added as a member - remove_member: Will be removed as a member - gain_and_lose_role: Will lose role ‘%{old_role}’ and gain role ‘%{new_role}’ - gain_role: Will gain role ‘%{new_role}’ - lose_role: Will lose role ‘%{old_role}’ - no_change: No changes + new_member: Sẽ được thêm làm thành viên + remove_member: Sẽ bị xóa tư cách thành viên + gain_and_lose_role: Sẽ mất vai trò ‘%{old_role}’ và nhận được vai trò ‘%{new_role}’ + gain_role: Sẽ nhận được vai trò ‘%{new_role}’ + lose_role: Sẽ mất vai trò ‘%{old_role}’ + no_change: Không có thay đổi text_add_new_custom_field: > Để thêm các trường tùy chỉnh mới vào một dự án, trước tiên bạn cần tạo chúng trước khi có thể thêm vào dự án này. - is_enabled_globally: "Được bật toàn cầu" + is_enabled_globally: "Được kích hoạt trên toàn cầu" enabled_in_project: "Đã bật trong dự án" - contained_in_type: "Được chứa trong loại" + contained_in_type: "Chứa trong loại" confirm_destroy_option: "Xóa một tùy chọn sẽ xóa tất cả các sự kiện của nó (ví dụ như trong các gói công việc). Bạn có chắc bạn muốn xóa bỏ nó?" - reorder_alphabetical: "Sắp xếp lại giá trị theo thứ tự bảng chữ cái" - reorder_confirmation: "Cảnh báo: Thứ tự hiện tại của các giá trị sẽ bị mất. Tiếp tục?" - placeholder_version_select: "Work package or project selection is required first" - calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically." - no_role_assigment: "No role assignment" + reorder_alphabetical: "Sắp xếp lại các giá trị theo thứ tự bảng chữ cái" + reorder_confirmation: "Cảnh báo: Thứ tự hiện tại của các giá trị sẵn có sẽ bị mất. Tiếp tục?" + placeholder_version_select: "Lựa chọn gói công việc hoặc dự án là bắt buộc trước tiên" + calculated_field_not_editable: "Thuộc tính không thể chỉnh sửa. Giá trị này được tính toán tự động." + no_role_assigment: "Không phân công vai trò" instructions: is_required: - all: "Mark the custom field as required. This will make it mandatory to fill in the field when creating new resources. Existing resources will not require a value when being updated." - project: "Required attributes need to be filled out by the user on project creation if the field is active ('For all projects' set or copying from a project/template in which the field is active). Existing projects will not require a value when being updated." + all: "Đánh dấu trường tùy chỉnh theo yêu cầu. Điều này sẽ khiến bạn bắt buộc phải điền vào trường khi tạo tài nguyên mới. Các tài nguyên hiện có sẽ không yêu cầu giá trị khi được cập nhật." + project: "Người dùng cần điền các thuộc tính bắt buộc khi tạo dự án nếu trường đang hoạt động (bộ 'Dành cho tất cả dự án' hoặc sao chép từ một dự án/mẫu trong đó trường đang hoạt động). Các dự án hiện tại sẽ không yêu cầu giá trị khi được cập nhật." is_for_all: - all: "Mark the custom field as available in all existing and new projects." - project: "Mark the attribute as available in all existing and new projects." + all: "Đánh dấu trường tùy chỉnh là có sẵn trong tất cả các dự án hiện có và mới." + project: "Đánh dấu thuộc tính là có sẵn trong tất cả các dự án hiện có và mới." multi_select: - all: "Allows the user to assign multiple values to this custom field." - project: "Allows the user to assign multiple values to this attribute." + all: "Cho phép người dùng chỉ định nhiều giá trị cho trường tùy chỉnh này." + project: "Cho phép người dùng gán nhiều giá trị cho thuộc tính này." searchable: - all: "Include the field values when using the global search functionality." - project: "Check to make this attribute available as a filter in project lists." + all: "Bao gồm các giá trị trường khi sử dụng chức năng tìm kiếm chung." + project: "Chọn để cung cấp thuộc tính này dưới dạng bộ lọc trong danh sách dự án." editable: - all: "Allow the field to be editable by users themselves." + all: "Cho phép người dùng tự chỉnh sửa trường này." admin_only: - all: "Check to make this custom field only visible to administrators. Users without admin rights will not be able to view or edit it." - project: "Check to make this attribute only visible to administrators. Users without admin rights will not be able to view or edit it." + all: "Chọn để làm cho trường tùy chỉnh này chỉ hiển thị với quản trị viên. Người dùng không có quyền quản trị viên sẽ không thể xem hoặc chỉnh sửa nó." + project: "Chọn để đặt thuộc tính này chỉ hiển thị với quản trị viên. Người dùng không có quyền quản trị viên sẽ không thể xem hoặc chỉnh sửa nó." is_filter: all: > - Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views. + Cho phép sử dụng trường tùy chỉnh trong bộ lọc trong chế độ xem gói công việc. Lưu ý rằng chỉ khi chọn 'Dành cho tất cả dự án', trường tùy chỉnh sẽ hiển thị ở chế độ xem chung. formula: - project: "Add numeric values or type / to search for an attribute or a mathematical operator." + project: "Thêm giá trị số hoặc nhập / để tìm kiếm thuộc tính hoặc toán tử toán học." tab: no_results_title_text: Không có hiện tại không có trường tùy chỉnh. no_results_content_text: Tạo trường tùy chỉnh mới calculated_values: error_dialog: - title: "Error with Calculated value" + title: "Lỗi với giá trị được tính toán" errors: - unknown: "An unknown error occurred. Please review the formula for this Calculated value." - mathematical: "The mathematical formula leads to an error. Please review the project calculation attribute and try again." - missing_value: The attribute "%{custom_field_name}" is required by this Calculated value, but is empty. - disabled_value: The attribute "%{custom_field_name}" is required by this Calculated value, but is disabled for the project. + unknown: "Đã xảy ra lỗi không xác định. Vui lòng xem lại công thức cho giá trị được tính toán này." + mathematical: "Công thức toán học dẫn đến một lỗi. Vui lòng xem lại thuộc tính tính toán dự án và thử lại." + missing_value: Thuộc tính "%{custom_field_name}" được yêu cầu bởi giá trị được tính toán này nhưng lại trống. + disabled_value: Thuộc tính "%{custom_field_name}" được yêu cầu bởi giá trị được tính toán này nhưng bị vô hiệu hóa đối với dự án. concatenation: single: "hoặc" danger_dialog: - confirmation_live_message_checked: "The button to proceed is now active." - confirmation_live_message_unchecked: "The button to proceed is now inactive. You need to tick the checkbox to continue." + confirmation_live_message_checked: "Nút để tiếp tục hiện đang hoạt động." + confirmation_live_message_unchecked: "Nút để tiếp tục hiện không hoạt động. Bạn cần đánh dấu vào hộp kiểm để tiếp tục." op_dry_validation: or: "hoặc" errors: - array?: "must be an array." - decimal?: "must be a decimal." - defined: "must not be defined." - eql?: "must be equal to %{left}." - filled?: "must be filled." - greater_or_equal_zero: "must be greater or equal to 0." - gteq?: "must be greater than or equal to %{num}." - hash?: "must be a hash." + array?: "phải là một mảng." + decimal?: "phải là số thập phân." + defined: "không được xác định." + eql?: "phải bằng %{left}." + filled?: "phải được lấp đầy." + greater_or_equal_zero: "phải lớn hơn hoặc bằng 0." + gteq?: "phải lớn hơn hoặc bằng %{num}." + hash?: "phải là một hàm băm." included_in?: arg: - default: "must be one of: %{list}." - range: "must be one of: %{list_left} - %{list_right}." - int?: "must be an integer." - key?: "is missing." - not_found: "not found." - respond_to?: "does not implement required method." + default: "phải là một trong: %{list}." + range: "phải là một trong: %{list_left} - %{list_right}." + int?: "phải là số nguyên." + key?: "bị thiếu." + not_found: "không tìm thấy." + respond_to?: "không thực hiện phương pháp cần thiết." rules: copy_workflow_from: - workflow_missing: "has no own workflow." + workflow_missing: "không có quy trình làm việc riêng." custom_field: - format_not_supported: "format '%{field_format}' is unsupported." + format_not_supported: "định dạng '%{field_format}' không được hỗ trợ." item: - root_item: "cannot be a root item." - not_persisted: "must be an already existing item." + root_item: "không thể là một mục gốc." + not_persisted: "phải là một mục đã tồn tại." label: - not_unique: "must be unique within the same hierarchy level." + not_unique: "phải là duy nhất trong cùng một cấp bậc." short: - not_unique: "must be unique within the same hierarchy level." + not_unique: "phải là duy nhất trong cùng một cấp bậc." parent: - not_descendant: "must be a descendant of the hierarchy root." - str?: "must be a string." - type?: "must be %{type}." + not_descendant: "phải là hậu duệ của gốc phân cấp." + str?: "phải là một chuỗi." + type?: "phải là %{type}." rules: - copy_workflow_from: "Type for workflow copy" - enabled: "Đã kích hoạt" - depth: "Depth" - item: "Item" - label: "Label" - weight: "Weight" - short: "Short name" - parent: "Cha" - blueprint: "Pattern blueprint" + copy_workflow_from: "Loại bản sao quy trình công việc" + enabled: "đã bật" + depth: "Độ sâu" + item: "mục" + label: "nhãn" + weight: "cân nặng" + short: "Tên viết tắt" + parent: "cha mẹ" + blueprint: "bản thiết kế hoa văn" global_search: title: - all_projects: 'Search for "%{search_term}" in all projects' - current_project: 'Search for "%{search_term}" in %{project_name}' - project_and_subprojects: 'Search for "%{search_term}" in %{project_name} and all subprojects' + all_projects: 'Tìm kiếm "%{search_term}" trong tất cả các dự án' + current_project: 'Tìm kiếm "%{search_term}" trong %{project_name}' + project_and_subprojects: 'Tìm kiếm "%{search_term}" trong %{project_name} và tất cả các dự án con' placeholder: "Tìm kiếm trong %{app_title}" overwritten_tabs: - all: "Tất cả" - messages: "Diễn đàn" - wiki_pages: "Wiki" + all: "tất cả" + messages: "diễn đàn" + wiki_pages: "wiki" groups: edit: - synchronized_groups: "Synchronized groups" + synchronized_groups: "Nhóm được đồng bộ hóa" index: - description: By grouping users together, you can add them as members to the same projects or assign the same global roles to them. + description: Bằng cách nhóm người dùng lại với nhau, bạn có thể thêm họ làm thành viên cho cùng một dự án hoặc chỉ định các vai trò chung giống nhau cho họ. table_component: blank_slate: - description: You can define named groups of users with specific permissions. - title: No groups set up yet - user_count: User count + description: Bạn có thể xác định các nhóm người dùng được đặt tên với các quyền cụ thể. + title: Chưa có nhóm nào được thành lập + user_count: Số người dùng users: no_results_title_text: Hiện có không có người sử dụng thuộc nhóm này. memberships: @@ -459,108 +476,108 @@ vi: synchronized_groups: blankslate: action: Cài đặt xác thực - description: When this group is automatically synced with groups in external identity providers like OpenID, they will appear here. You can set this up in your Authentication settings. - title: No synchronized groups yet + description: Khi nhóm này được tự động đồng bộ hóa với các nhóm trong nhà cung cấp danh tính bên ngoài như OpenID, họ sẽ xuất hiện ở đây. Bạn có thể thiết lập tính năng này trong cài đặt Xác thực của mình. + title: Chưa có nhóm được đồng bộ hóa incoming_mails: ignore_filenames: > Chỉ định danh sách các tên cần bỏ qua khi xử lý tệp đính kèm cho thư đến (ví dụ: chữ ký hoặc biểu tượng). Nhập một tên tệp trên mỗi dòng. portfolios: index: search: - label: Portfolio name filter - placeholder: Search portfolios + label: Bộ lọc tên danh mục đầu tư + placeholder: Tìm kiếm danh mục đầu tư sub_items_html: - other: "%{count} sub-items" + other: "%{count} mục phụ" lists: - active: "Active portfolios" - my: "My portfolios" - favorited: "Favorite portfolios" - archived: "Archived portfolios" + active: "Danh mục đầu tư đang hoạt động" + my: "Danh mục đầu tư của tôi" + favorited: "Danh mục yêu thích" + archived: "Danh mục lưu trữ" projects: copy: #Contains custom strings for options when copying a project that cannot be found elsewhere. - members: "Thành viên dự án" + members: "thành viên dự án" overviews: "Tổng quan dự án" - queries: "Gói công việc: chế độ xem đã lưu" - wiki_page_attachments: "Trang wiki: tệp đính kèm" + queries: "Gói công việc: lượt xem đã lưu" + wiki_page_attachments: "Trang Wiki: tệp đính kèm" work_package_attachments: "Gói công việc: tệp đính kèm" work_package_categories: "Gói công việc: danh mục" - work_package_file_links: "Gói công việc: liên kết tệp" - work_package_shares: "Gói công việc: chia sẻ" + work_package_file_links: "Gói công việc: liên kết tập tin" + work_package_shares: "Gói công việc: cổ phiếu" create: - notification_email_subject: "Your project '%{project_name}' has been created" - complete_wizard_link: "Complete the %{artefact_name}" + notification_email_subject: "Dự án '%{project_name}' của bạn đã được tạo" + complete_wizard_link: "Hoàn thành %{artefact_name}" delete: - scheduled: "Việc xóa đã được lên lịch và thực hiện trong nền. Bạn sẽ được thông báo về kết quả." + scheduled: "Việc xóa đã được lên lịch và được thực hiện ở chế độ nền. Bạn sẽ được thông báo về kết quả." schedule_failed: "Dự án không thể bị xóa: %{errors}" - failed: "Deletion of project '%{name}' has failed" - failed_text: "The request to delete project '%{name}' has failed. The project was left archived." - completed: "Deletion of project '%{name}' completed" + failed: "Xóa dự án '%{name}' không thành công" + failed_text: "Yêu cầu xóa dự án '%{name}' không thành công. Dự án đã được lưu trữ." + completed: "Việc xóa dự án '%{name}' đã hoàn tất" completed_text: "Yêu cầu xóa dự án '%{name}' đã được hoàn thành." - completed_text_children: "Ngoài ra, các dự án phụ sau đây đã bị xóa:" + completed_text_children: "Ngoài ra, các tiểu dự án sau đã bị xóa:" index: - open_as_gantt: "Mở dưới dạng chế độ xem Gantt" + open_as_gantt: "Mở dưới dạng dạng xem Gantt" no_results_title_text: Không có dự án nào no_results_content_text: Tạo một dự án mới search: label: Bộ lọc tên dự án placeholder: Tìm kiếm theo tên dự án lists: - active: "Các dự án đang hoạt động" - my: "Dự án của tôi" - favorited: "Dự án yêu thích" - archived: "Các dự án đã lưu trữ" + active: "Dự án đang hoạt động" + my: "dự án của tôi" + favorited: "dự án yêu thích" + archived: "Dự án đã lưu trữ" shared: "Danh sách dự án được chia sẻ" my_lists: "Danh sách dự án của tôi" new: placeholder: "Danh sách dự án mới" delete_modal: title: "Xóa danh sách dự án" - heading: "Delete this project list?" - text: "Hành động này sẽ không xóa bất kỳ dự án nào có trong danh sách. Bạn có chắc chắn muốn xóa danh sách dự án này không?" + heading: "Xóa danh sách dự án này?" + text: "Hành động này sẽ không xóa bất kỳ dự án nào có trong danh sách. Bạn có chắc chắn muốn xóa danh sách dự án này?" settings: - header_details: Basic details - header_status: Status - header_relations: Project relations - button_update_details: Update details - button_update_status_description: Update status description - button_update_parent_project: Update parent project + header_details: Chi tiết cơ bản + header_status: trạng thái + header_relations: Quan hệ dự án + button_update_details: Cập nhật chi tiết + button_update_status_description: Cập nhật mô tả trạng thái + button_update_parent_project: Cập nhật dự án mẹ public_warning: > - This project is public. Anyone who has access to this instance will be able to view and interact with this project depending on their role and associated permissions. Sub-projects are not affected and have their own settings. + Dự án này là công khai. Bất kỳ ai có quyền truy cập vào phiên bản này đều có thể xem và tương tác với dự án này tùy thuộc vào vai trò và các quyền liên quan của họ. Các tiểu dự án không bị ảnh hưởng và có cài đặt riêng. public_confirmation: - checkbox: "I understand that this will make the previously private content public" - title: "Make this project public?" + checkbox: "Tôi hiểu rằng điều này sẽ công khai nội dung riêng tư trước đó" + title: "Công khai dự án này?" description: > - Anyone who has access to this instance will be able to view and interact with this project depending on their role and authentication settings. Sub-projects are not affected and have their own settings. + Bất kỳ ai có quyền truy cập vào phiên bản này đều có thể xem và tương tác với dự án này tùy thuộc vào vai trò và cài đặt xác thực của họ. Các tiểu dự án không bị ảnh hưởng và có cài đặt riêng. private_confirmation: - checkbox: "I understand that this will make the previously public content private." - title: "Make this project private?" + checkbox: "Tôi hiểu rằng điều này sẽ khiến nội dung công khai trước đó trở nên riêng tư." + title: "Đặt dự án này ở chế độ riêng tư?" description: > - The project will only be visible to project members depending on their role and associated permissions. Sub-projects are not affected and have their own settings. + Dự án sẽ chỉ hiển thị với các thành viên dự án tùy thuộc vào vai trò và quyền liên quan của họ. Các tiểu dự án không bị ảnh hưởng và có cài đặt riêng. change_identifier: Thay đổi định danh subitems: template_section: > - Select templates to be used when creating new subitems. - project_template_label: "Template for projects" - project_template_caption: "Select a template project to be used as the default for new subitems of this type." - program_template_label: "Template for programs" - program_template_caption: "Select a template program to be used as the default for new subitems of this type." - no_template: "No predefined template" + Chọn các mẫu sẽ được sử dụng khi tạo các mục con mới. + project_template_label: "Mẫu cho dự án" + project_template_caption: "Chọn một dự án mẫu sẽ được sử dụng làm mặc định cho các mục con mới thuộc loại này." + program_template_label: "Mẫu chương trình" + program_template_caption: "Chọn một chương trình mẫu sẽ được sử dụng làm mặc định cho các mục con mới thuộc loại này." + no_template: "Không có mẫu được xác định trước" template: - menu_title: "Template" - title: "Template settings" - enable_failed: "Failed to enable template mode." + menu_title: "mẫu" + title: "Cài đặt mẫu" + enable_failed: "Không bật được chế độ mẫu." members: - excluded_roles_label: "Roles to exclude when template is applied" + excluded_roles_label: "Các vai trò cần loại trừ khi áp dụng mẫu" excluded_roles_caption: > - When creating a new project from this template, the roles selected above will be omitted. This allows you to select which members will be excluded based on their project roles. Users can then access the template for viewing purposes without being granted access to new projects created from it. + Khi tạo dự án mới từ mẫu này, các vai trò đã chọn ở trên sẽ bị bỏ qua. Điều này cho phép bạn chọn thành viên nào sẽ bị loại trừ dựa trên vai trò dự án của họ. Sau đó, người dùng có thể truy cập mẫu cho mục đích xem mà không được cấp quyền truy cập vào các dự án mới được tạo từ mẫu đó. actions: - label_enable_all: "Bật tất cả" - label_disable_all: "Tắt tất cả" + label_enable_all: "Kích hoạt tất cả" + label_disable_all: "Vô hiệu hóa tất cả" activities: no_results_title_text: Không có hoạt động nào hiện tại. forums: - no_results_title_text: Hiện không có diễn đàn nào cho dự án. + no_results_title_text: Hiện tại không có diễn đàn cho dự án. no_results_content_text: Tạo diễn đàn mới categories: no_results_title_text: Hiện có không có nhóm gói công việc. @@ -569,14 +586,14 @@ vi: no_results_title_text: Không không có trường tùy chỉnh. life_cycle: header: - title: "Project life cycle" - description_html: 'The active project phases define this project''s life cycle and are defined in the administration settings. Enabled phases will be displayed in your project overview.' - non_defined: "No phases are currently defined." - section_header: "Phases" + title: "Vòng đời dự án" + description_html: 'Các giai đoạn hoạt động của dự án xác định chu kỳ sống của dự án và được định nghĩa trong cài đặt quản trị. Các giai đoạn được kích hoạt sẽ được hiển thị trong tổng quan dự án.' + non_defined: "Hiện tại không có giai đoạn nào được xác định." + section_header: "giai đoạn" step: - use_in_project: "Use %{step} in this project" + use_in_project: "Sử dụng %{step} trong dự án này" filter: - label: "Search project phase" + label: "Tìm kiếm giai đoạn dự án" project_custom_fields: header: title: "Các thuộc tính dự án" @@ -584,12 +601,13 @@ vi: filter: label: "Tìm kiếm thuộc tính dự án" actions: - label_enable_single: "Kích hoạt trong dự án này, nhấp để tắt" - label_disable_single: "Không kích hoạt trong dự án này, nhấp để bật" + label_enable_single: "Đang hoạt động trong dự án này, nhấp để tắt" + label_disable_single: "Không hoạt động trong dự án này, nhấp để bật" remove_from_project: "Xóa khỏi dự án" is_for_all_blank_slate: - heading: For all projects - description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + heading: Đối với tất cả các dự án + description: Thuộc tính dự án này được bật trong tất cả các dự án vì tùy chọn "Dành cho tất cả dự án" được chọn. Nó không thể bị vô hiệu hóa đối với các dự án riêng lẻ. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: Không có phân loại. form: @@ -597,344 +615,351 @@ vi: versions: no_results_title_text: Hiện đang có phiên bản dự án. no_results_content_text: Tạo ra một phiên bản mới - work_packages_graph: Đồ thị gói công việc - show_work_packages: Show work packages + work_packages_graph: Biểu đồ gói công việc + show_work_packages: Hiển thị các gói công việc storage: - no_results_title_text: Không có không gian đĩa bổ sung nào được ghi nhận bởi dự án này. + no_results_title_text: Không có dung lượng đĩa ghi bổ sung nào được sử dụng bởi dự án này. work_package_priorities: - new_label: "New priority" + new_label: "Ưu tiên mới" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: - description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." - description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." - description_file_storage_selection: "Select which of the configured external file storages should be used." - external_file_storage: "External file storage" - label_artifact_export: "Artifact export" - label_attachment_export: "Save as work package file attachment" - label_file_link_export: "Upload file to external file storage and add file link to work package" - pdf_file_storage: "PDF file storage" - unavailable: "unavailable" - label_request_submission: "Request submission" + description_attachment_export: "Tạo tác được tạo sẽ được lưu dưới dạng tệp đính kèm PDF vào gói tác phẩm tạo tác." + description_file_link_export: "Gói công việc tạo tác sẽ có liên kết tệp tới tệp PDF được lưu trữ trong bộ lưu trữ tệp bên ngoài. Yêu cầu lưu trữ tệp đang hoạt động với các thư mục dự án được quản lý tự động cho dự án này. Hiện tại chỉ hỗ trợ lưu trữ tệp Nextcloud." + description_file_storage_selection: "Chọn kho lưu trữ tệp bên ngoài được định cấu hình sẽ được sử dụng." + external_file_storage: "Lưu trữ tập tin bên ngoài" + label_artifact_export: "Xuất khẩu hiện vật" + label_attachment_export: "Lưu dưới dạng tệp đính kèm tệp gói công việc" + label_file_link_export: "Tải tệp lên bộ lưu trữ tệp bên ngoài và thêm liên kết tệp vào gói công việc" + pdf_file_storage: "lưu trữ tập tin PDF" + unavailable: "không có sẵn" + label_request_submission: "Yêu cầu gửi" project_attributes_description: > - Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + Chọn thuộc tính dự án nào sẽ được đưa vào yêu cầu khởi tạo dự án. Danh sách này chỉ bao gồm [project attributes](project_attributes_url) được bật cho dự án này. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: - button_edit: Edit status + button_edit: Chỉnh sửa trạng thái wizard: - sidebar_content_title: "Content" - sections: "Sections" - title: "Project initiation request" - no_help_text: "This attribute has no help text defined." - success: "Project attributes saved and artifact work package created successfully." - progress_label: "%{current} of %{total}" - create_artifact_work_package_error: "Failed to create artifact work package" - create_artifact_storage_error: "Failed to store artifact in file storage" + sidebar_content_title: "Nội dung" + sections: "phần" + title: "Yêu cầu khởi tạo dự án" + no_help_text: "Thuộc tính này không có văn bản trợ giúp được xác định." + success: "Thuộc tính dự án đã được lưu và gói công việc tạo tác được tạo thành công." + progress_label: "%{current} trong số %{total}" + create_artifact_work_package_error: "Không tạo được gói công việc tạo tác" + create_artifact_storage_error: "Không thể lưu trữ thành phần lạ trong bộ lưu trữ tệp" lists: create: - success: "Danh sách đã sửa đổi đã được lưu thành danh sách mới" + success: "Danh sách sửa đổi đã được lưu dưới dạng danh sách mới" failure: "Không thể lưu danh sách đã sửa đổi: %{errors}" update: - success: "Danh sách đã sửa đổi đã được lưu" + success: "Danh sách sửa đổi đã được lưu" failure: "Không thể lưu danh sách đã sửa đổi: %{errors}" publish: - success: "Danh sách đã được công bố" + success: "Danh sách đã được công khai" failure: "Danh sách không thể được công khai: %{errors}" unpublish: - success: "Danh sách đã được giữ riêng tư" - failure: "Không thể đặt danh sách ở chế độ riêng tư: %{errors}" + success: "Danh sách đã được giữ kín" + failure: "Danh sách không thể được đặt ở chế độ riêng tư: %{errors}" can_be_saved: "Danh sách đã sửa đổi:" - can_be_saved_as: "Những sửa đổi chỉ có thể được lưu trong danh sách mới:" + can_be_saved_as: "Các sửa đổi chỉ có thể được lưu trong danh sách mới:" members: index: no_results_title_text: Hiện có không có thành viên của dự án này. no_results_content_text: Thêm một thành viên vào dự án invite_by_mail: "Gửi lời mời cho %{mail}" - send_invite_to: "Gửi lời mời đến" + send_invite_to: "Gửi lời mời tới" columns: - shared: "Được chia sẻ" + shared: "đã chia sẻ" filters: - all_shares: "Tất cả các chia sẻ" + all_shares: "Tất cả các lượt chia sẻ" menu: - all: "Tất cả" + all: "tất cả" invited: "Đã mời" - locked: "Đã khóa" - project_roles: "Vai trò trong dự án" + locked: "bị khóa" + project_roles: "Vai trò dự án" wp_shares: "Chia sẻ gói công việc" - groups: "Các Nhóm" + groups: "nhóm" delete_member_dialog: title: "Xóa thành viên" - will_remove_the_users_role: "Điều này sẽ xóa vai trò của người dùng trong dự án này." - will_remove_the_groups_role: "Điều này sẽ xóa vai trò của nhóm trong dự án này." + will_remove_the_users_role: "Điều này sẽ loại bỏ vai trò của người dùng khỏi dự án này." + will_remove_the_groups_role: "Điều này sẽ loại bỏ vai trò nhóm khỏi dự án này." however_work_packages_shared_with_user_html: other: "Tuy nhiên, %{shared_work_packages_link} cũng đã được chia sẻ với người dùng này." however_work_packages_shared_with_group_html: other: "Tuy nhiên, %{shared_work_packages_link} cũng đã được chia sẻ với nhóm này." - remove_work_packages_shared_with_user_too: "Một người dùng đã bị xóa vẫn có thể truy cập các gói công việc đã được chia sẻ. Bạn có muốn xóa các chia sẻ này không?" - remove_work_packages_shared_with_group_too: "Một nhóm đã bị xóa vẫn có thể truy cập các gói công việc đã được chia sẻ. Bạn có muốn xóa các chia sẻ này không?" + remove_work_packages_shared_with_user_too: "Người dùng đã bị xóa tư cách thành viên vẫn có thể truy cập các gói công việc được chia sẻ. Bạn có muốn xóa các lượt chia sẻ không?" + remove_work_packages_shared_with_group_too: "Một nhóm đã bị loại bỏ tư cách thành viên vẫn có thể truy cập các gói công việc được chia sẻ. Bạn có muốn xóa các lượt chia sẻ không?" will_not_affect_inherited_shares: "(Điều này sẽ không ảnh hưởng đến các gói công việc được chia sẻ với nhóm của họ)." - can_remove_direct_but_not_shared_roles: "Bạn có thể xóa người dùng này khỏi tư cách thành viên dự án trực tiếp nhưng nhóm mà họ thuộc về cũng là thành viên của dự án này, vì vậy họ sẽ tiếp tục là thành viên qua nhóm." + can_remove_direct_but_not_shared_roles: "Bạn có thể xóa người dùng này với tư cách là thành viên trực tiếp của dự án nhưng nhóm mà họ tham gia cũng là thành viên của dự án này, vì vậy họ sẽ tiếp tục là thành viên thông qua nhóm." also_work_packages_shared_with_user_html: other: "Ngoài ra, %{shared_work_packages_link} đã được chia sẻ với người dùng này." - remove_project_membership_or_work_package_shares_too: "Bạn muốn chỉ xóa người dùng này khỏi tư cách thành viên trực tiếp (và giữ lại các chia sẻ) hay xóa luôn các chia sẻ gói công việc?" - will_remove_all_user_access_priveleges: "Việc xóa thành viên này sẽ xóa tất cả quyền truy cập của người dùng vào dự án. Người dùng vẫn sẽ tồn tại trong hệ thống." - will_remove_all_group_access_priveleges: "Việc xóa thành viên này sẽ xóa tất cả quyền truy cập của nhóm vào dự án. Nhóm vẫn sẽ tồn tại trong hệ thống." + remove_project_membership_or_work_package_shares_too: "Bạn chỉ muốn xóa người dùng với tư cách là thành viên trực tiếp (và giữ lại phần chia sẻ) hay xóa cả phần chia sẻ gói công việc?" + will_remove_all_user_access_priveleges: "Xóa thành viên này sẽ xóa tất cả các đặc quyền truy cập của người dùng vào dự án. Người dùng sẽ vẫn tồn tại như một phần của phiên bản." + will_remove_all_group_access_priveleges: "Xóa thành viên này sẽ xóa tất cả các đặc quyền truy cập của nhóm vào dự án. Nhóm sẽ vẫn tồn tại như một phần của phiên bản." cannot_delete_inherited_membership: "Bạn không thể xóa thành viên này vì họ thuộc về một nhóm cũng là thành viên của dự án này." - cannot_delete_inherited_membership_note_admin_html: "Bạn có thể xóa nhóm khỏi dự án hoặc xóa thành viên cụ thể này khỏi nhóm trong %{administration_settings_link}." - cannot_delete_inherited_membership_note_non_admin: "Bạn có thể xóa nhóm khỏi dự án hoặc liên hệ với quản trị viên để xóa thành viên cụ thể này khỏi nhóm." + cannot_delete_inherited_membership_note_admin_html: "Bạn có thể xóa nhóm với tư cách là thành viên của dự án hoặc thành viên cụ thể này khỏi nhóm trong %{administration_settings_link}." + cannot_delete_inherited_membership_note_non_admin: "Bạn có thể xóa nhóm với tư cách thành viên của dự án hoặc liên hệ với quản trị viên của mình để xóa thành viên cụ thể này khỏi nhóm." delete_work_package_shares_dialog: title: "Thu hồi quyền chia sẻ gói công việc" shared_with_this_user_html: - other: "Ngoài ra, %{all_shared_work_packages_link} đã được chia sẻ với người dùng này." + other: "%{all_shared_work_packages_link} đã được chia sẻ với người dùng này." shared_with_this_group_html: other: "%{all_shared_work_packages_link} đã được chia sẻ với nhóm này." shared_with_permission_html: - other: "Chỉ có %{shared_work_packages_link} được chia sẻ với quyền %{shared_role_name}." - revoke_all_or_with_role: "Bạn muốn thu hồi quyền truy cập vào tất cả các gói công việc chia sẻ, hay chỉ các gói công việc với quyền %{shared_role_name}?" + other: "Chỉ %{shared_work_packages_link} được chia sẻ với quyền %{shared_role_name}." + revoke_all_or_with_role: "Bạn muốn thu hồi quyền truy cập vào tất cả các gói công việc được chia sẻ hay chỉ những gói có quyền %{shared_role_name}?" will_not_affect_inherited_shares: "(Điều này sẽ không ảnh hưởng đến các gói công việc được chia sẻ với nhóm của họ)." - cannot_remove_inherited: "Các chia sẻ gói công việc chia sẻ qua nhóm không thể bị xóa." - cannot_remove_inherited_with_role: "Các chia sẻ gói công việc với quyền %{shared_role_name} được chia sẻ qua nhóm và không thể bị xóa." - cannot_remove_inherited_note_admin_html: "Bạn có thể thu hồi chia sẻ cho nhóm hoặc xóa thành viên cụ thể này khỏi nhóm trong %{administration_settings_link}." - cannot_remove_inherited_note_non_admin: "Bạn có thể thu hồi chia sẻ cho nhóm hoặc liên hệ với quản trị viên để xóa thành viên cụ thể này khỏi nhóm." - will_revoke_directly_granted_access: "Hành động này sẽ thu hồi quyền truy cập của họ vào tất cả các gói công việc, nhưng không ảnh hưởng đến các gói công việc chia sẻ với nhóm." - will_revoke_access_to_all: "Hành động này sẽ thu hồi quyền truy cập của họ vào tất cả các gói công việc." + cannot_remove_inherited: "Không thể xóa các gói công việc được chia sẻ qua nhóm." + cannot_remove_inherited_with_role: "Các gói công việc chia sẻ với vai trò %{shared_role_name} được chia sẻ qua các nhóm và không thể xóa được." + cannot_remove_inherited_note_admin_html: "Bạn có thể thu hồi quyền chia sẻ đối với nhóm hoặc xóa thành viên cụ thể này khỏi nhóm trong %{administration_settings_link}." + cannot_remove_inherited_note_non_admin: "Bạn có thể thu hồi quyền chia sẻ với nhóm hoặc liên hệ với quản trị viên của mình để xóa thành viên cụ thể này khỏi nhóm." + will_revoke_directly_granted_access: "Hành động này sẽ thu hồi quyền truy cập của họ vào tất cả chúng, nhưng các gói công việc được chia sẻ với một nhóm." + will_revoke_access_to_all: "Hành động này sẽ thu hồi quyền truy cập của họ vào tất cả chúng." my: access_token: dialog: token/api: - dialog_title: "Tạo token API mới" - attention_text: "Treat API tokens like passwords. Anyone with this token will have access to information from this instance, share it only with trusted users." - dialog_body: "Token này sẽ cho phép các ứng dụng bên thứ ba giao tiếp với hệ thống của bạn. Để phân biệt token API mới, vui lòng đặt tên cho nó." - create_button: "Tạo mới" - name_label: "Token name" + dialog_title: "Tạo mã thông báo API mới" + attention_text: "Hãy coi mã thông báo API như mật khẩu. Bất kỳ ai có mã thông báo này sẽ có quyền truy cập vào thông tin từ phiên bản này và chỉ chia sẻ thông tin đó với những người dùng đáng tin cậy." + dialog_body: "Mã thông báo này sẽ cho phép các ứng dụng của bên thứ ba giao tiếp với phiên bản của bạn. Để phân biệt mã thông báo API mới, vui lòng đặt tên cho nó." + create_button: "Tạo" + name_label: "Tên mã thông báo" created_dialog: + one_time_warning: "Đây là lần duy nhất bạn sẽ thấy mã thông báo này. Hãy chắc chắn để sao chép nó ngay bây giờ." token/api: - title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + title: "Mã thông báo API đã được tạo" + token/rss: + title: "Mã thông báo RSS đã được tạo" failed_to_reset_token: "Lỗi cập nhật mã truy cập: %{error}" - failed_to_create_token: "Không thể tạo token truy cập: %{error}" - failed_to_revoke_token: "Không thể thu hồi token truy cập: %{error}" + failed_to_create_token: "Không tạo được mã thông báo truy cập: %{error}" + failed_to_revoke_token: "Không thu hồi được mã thông báo truy cập: %{error}" notice_reset_token: "Một mã %{type} truy cập mới vừa được tạo. Mã truy cập của bạn là:" token_value_warning: "Chú ý: Mã này chỉ hiện duy nhất một lần, bạn nên sao chép lại để lưu trữ." no_results_title_text: "Không có thẻ truy cập hiện hữu." - notice_api_token_revoked: "Token API đã bị xóa. Để tạo token mới, vui lòng sử dụng nút trong phần API." - notice_rss_token_revoked: "Token RSS đã bị xóa. Để tạo token mới, vui lòng sử dụng liên kết trong phần RSS." - notice_ical_token_revoked: 'Token iCalendar "%{token_name}" cho lịch "%{calendar_name}" của dự án "%{project_name}" đã bị thu hồi. URL iCalendar với token này hiện không hợp lệ.' + notice_api_token_revoked: "Mã thông báo API đã bị xóa. Để tạo mã thông báo mới, vui lòng sử dụng nút trong phần API." + notice_rss_token_revoked: "Mã thông báo RSS đã bị xóa. Để tạo mã thông báo mới, vui lòng sử dụng liên kết trong phần RSS." + notice_ical_token_revoked: 'Mã thông báo iCalendar "%{token_name}" cho lịch "%{calendar_name}" của dự án "%{project_name}" đã bị thu hồi. URL iCalendar có mã thông báo này hiện không hợp lệ.' + password_confirmation_dialog: + confirmation_required: "Bạn cần nhập mật khẩu tài khoản của mình để xác nhận thay đổi này." + title: "Xác nhận mật khẩu của bạn để tiếp tục" news: index: no_results_title_text: Hiện không có tin tức báo cáo. no_results_content_text: Thêm một mục tin tức roles: permissions: - section_check_all_label: "Assign all %{module} permissions" - section_uncheck_all_label: "Unassign all %{module} permissions" + section_check_all_label: "Gán tất cả các quyền %{module}" + section_uncheck_all_label: "Bỏ gán tất cả quyền %{module}" report: - matrix_caption: "Permissions matrix for %{module} module" - matrix_checkbox_label: "Assign %{permission} permission to %{role} role" - matrix_check_all_label: "Assign all %{module} permissions to all roles" - matrix_uncheck_all_label: "Unassign all %{module} permissions from all roles" - matrix_check_uncheck_all_in_row_label_html: "Toggle %{permission} permission for all roles" - matrix_check_uncheck_all_in_col_label_html: "Toggle all %{module} permissions for %{role} role" + matrix_caption: "Ma trận quyền cho mô-đun %{module}" + matrix_checkbox_label: "Gán quyền %{permission} cho vai trò %{role}" + matrix_check_all_label: "Gán tất cả các quyền %{module} cho tất cả các vai trò" + matrix_uncheck_all_label: "Bỏ gán tất cả các quyền %{module} khỏi tất cả các vai trò" + matrix_check_uncheck_all_in_row_label_html: "Chuyển đổi quyền %{permission} cho tất cả các vai trò" + matrix_check_uncheck_all_in_col_label_html: "Bật/tắt tất cả quyền truy cập của %{module} cho vai trò %{role}" users: autologins: - prompt: "Giữ đăng nhập trong %{num_days}" + prompt: "Duy trì đăng nhập cho %{num_days}" sessions: session_name: "%{browser_name} %{browser_version} trên %{os_name}" - browser: "Trình duyệt" + browser: "trình duyệt" expires: "Hết hạn" - last_connection: "Kết nối lần cuối" - device: "Thiết bị / Hệ điều hành" + last_connection: "Kết nối cuối cùng" + device: "Thiết bị/HĐH" unknown_browser: "trình duyệt không xác định" unknown_os: "hệ điều hành không xác định" - unknown: "(unknown)" - browser_session: "(Browser session)" - current: "Current (this device)" + unknown: "(không rõ)" + browser_session: "(Phiên trình duyệt)" + current: "Hiện tại (thiết bị này)" title: "Quản lý phiên" - instructions: "You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control." + instructions: "Bạn đã đăng nhập vào tài khoản của mình thông qua các thiết bị sau. Thu hồi các phiên mà bạn không nhận ra hoặc từ các thiết bị bạn không kiểm soát." may_not_delete_current: "Bạn không thể xóa phiên hiện tại của mình." - deletion_warning: "Are you sure you want to revoke this session? You will be logged out on this device." + deletion_warning: "Bạn có chắc chắn muốn thu hồi phiên này không? Bạn sẽ đăng xuất trên thiết bị này." groups: member_in_these_groups: "Người dùng này hiện là thành viên của các nhóm sau:" - no_results_title_text: Người dùng này hiện không phải là thành viên của nhóm nào. - summary_with_more: Member of %{names} and %{count_link}. - more: "%{count} more" - summary: Member of %{names}. + no_results_title_text: Người dùng này hiện không phải là thành viên trong bất kỳ nhóm nào. + summary_with_more: Thành viên của %{names} và %{count_link}. + more: "%{count} thêm" + summary: Thành viên của %{names}. memberships: no_results_title_text: Người dùng này không phải là thành viên của dự án. - open_profile: "Open profile" + open_profile: "Mở hồ sơ" invite_user_modal: invite: "Mời" title: invite: "Mời người dùng" - invite_to_project: "Mời %{type} vào %{project}" - invite_principal_to_project: "Mời %{principal} vào %{project}" + invite_to_project: "Mời %{type} tới %{project}" + invite_principal_to_project: "Mời %{principal} tới %{project}" project: - label: "Dự án" + label: "dự án" required: "Vui lòng chọn một dự án" - next_button: "Tiếp" - no_results: "Không tìm thấy dự án nào" + next_button: "Tiếp theo" + no_results: "Không có dự án nào được tìm thấy" no_invite_rights: "Bạn không được phép mời thành viên vào dự án này" type: - required: "Vui lòng chọn loại để mời" + required: "Vui lòng chọn loại được mời" user: - title: "Invite user to %{project_name}" - description: "Quyền dựa trên vai trò được phân công trong dự án đã chọn" + title: "Mời người dùng %{project_name}" + description: "Quyền dựa trên vai trò được giao trong dự án đã chọn" group: - title: "Invite group to %{project_name}" - description: "Quyền dựa trên vai trò được phân công trong dự án đã chọn" + title: "Mời nhóm tham gia %{project_name}" + description: "Quyền dựa trên vai trò được giao trong dự án đã chọn" placeholder_user: - title: "Add placeholder user to %{project_name}" - title_no_ee: "Người dùng tạm thời (chỉ có trong phiên bản Doanh nghiệp)" - description: "Không có quyền truy cập vào dự án và không có email được gửi đi." + title: "Thêm người dùng giữ chỗ vào %{project_name}" + title_no_ee: "Người dùng giữ chỗ (tiện ích bổ sung chỉ dành cho phiên bản Enterprise)" + description: "Không có quyền truy cập vào dự án và không có email nào được gửi đi." already_member_message: "Đã là thành viên của %{project}" principal: - no_results_user: "Không tìm thấy người dùng" + no_results_user: "Không tìm thấy người dùng nào" invite_user: "Mời:" - no_results_placeholder: "Không tìm thấy người dùng tạm thời" - create_new_placeholder: "Tạo người dùng tạm thời mới:" - no_results_group: "Không tìm thấy nhóm" - invite_to_project: "Invite to %{project_name}" + no_results_placeholder: "Không tìm thấy phần giữ chỗ nào" + create_new_placeholder: "Tạo trình giữ chỗ mới:" + no_results_group: "Không tìm thấy nhóm nào" + invite_to_project: "Mời tham gia %{project_name}" required: user: "Vui lòng chọn một người dùng" - placeholder: "Vui lòng chọn một người dùng tạm thời" + placeholder: "Vui lòng chọn một trình giữ chỗ" group: "Vui lòng chọn một nhóm" role: label: "Vai trò trong %{project}" no_roles_found: "Không tìm thấy vai trò nào" description: > - This is the role that the user will receive when they join your project. The role defines which actions they are allowed to take and which information they are allowed to see. [Learn more about roles and permissions.](docs_url) + Đây là vai trò mà người dùng sẽ nhận được khi họ tham gia dự án của bạn. Vai trò xác định những hành động nào họ được phép thực hiện và thông tin nào họ được phép xem. [Learn more about roles and permissions.](docs_url) required: "Vui lòng chọn một vai trò" message: label: "Tin nhắn mời" - description: "We will send an email to the user, to which you can add a personal message here. An explanation for the invitation could be useful, or perhaps a bit of information regarding the project to help them get started." + description: "Chúng tôi sẽ gửi email cho người dùng để bạn có thể thêm tin nhắn cá nhân tại đây. Lời giải thích cho lời mời có thể hữu ích hoặc có thể là một chút thông tin liên quan đến dự án để giúp họ bắt đầu." summary: next_button: "Gửi lời mời" success_message: - user: "Người dùng có thể đăng nhập để truy cập %{project}. Trong khi đó, bạn có thể lên kế hoạch với người dùng đó và phân công các gói công việc ví dụ." - placeholder_user: "Người dùng tạm thời có thể được sử dụng trong %{project}. Trong khi đó, bạn có thể lên kế hoạch với người dùng đó và phân công các gói công việc ví dụ." - group: "Nhóm hiện đã là một phần của %{project}. Trong khi đó, bạn có thể lên kế hoạch với nhóm đó và phân công các gói công việc ví dụ." + user: "Bây giờ người dùng có thể đăng nhập để truy cập %{project}. Trong khi đó, bạn có thể lập kế hoạch với người dùng đó và chỉ định các gói công việc chẳng hạn." + placeholder_user: "Trình giữ chỗ hiện có thể được sử dụng trong %{project}. Trong khi đó, bạn có thể lập kế hoạch với người dùng đó và chỉ định các gói công việc chẳng hạn." + group: "Nhóm hiện là một phần của %{project}. Trong khi đó, bạn có thể lập kế hoạch với nhóm đó và phân công các gói công việc chẳng hạn." page: - text: "Văn bản" + text: "văn bản" placeholder_users: right_to_manage_members_missing: > - Bạn không được phép xóa người dùng giả định. Bạn không có quyền quản lý thành viên cho tất cả các dự án mà người dùng giả định là thành viên. - delete_tooltip: "Xóa người dùng giả định" + Bạn không được phép xóa người dùng giữ chỗ. Bạn không có quyền quản lý thành viên cho tất cả các dự án mà người dùng giữ chỗ là thành viên. + delete_tooltip: "Xóa người dùng giữ chỗ" deletion_info: - heading: "Xóa người dùng giả định %{name}" + heading: "Xóa người dùng giữ chỗ %{name}" data_consequences: > - Tất cả các trường hợp của người dùng giả định (ví dụ, làm người giao việc, người chịu trách nhiệm hoặc các giá trị người dùng khác) sẽ được chuyển nhượng cho một tài khoản có tên là "Người dùng đã xóa". Vì dữ liệu của mỗi tài khoản bị xóa được chuyển nhượng cho tài khoản này, nên sẽ không thể phân biệt dữ liệu mà người dùng đã tạo từ dữ liệu của một tài khoản đã xóa khác. - irreversible: "Hành động này không thể đảo ngược" - confirmation: "Nhập tên người dùng giả định %{name} để xác nhận việc xóa." + Tất cả các lần xuất hiện của người dùng giữ chỗ (ví dụ: với tư cách là người được chuyển nhượng, người chịu trách nhiệm hoặc giá trị người dùng khác) sẽ được chỉ định lại cho tài khoản có tên "Người dùng đã xóa". Vì dữ liệu của mọi tài khoản đã xóa được gán lại cho tài khoản này nên sẽ không thể phân biệt dữ liệu người dùng đã tạo với dữ liệu của tài khoản đã xóa khác. + irreversible: "Hành động này không thể thay đổi được" + confirmation: "Nhập tên người dùng giữ chỗ %{name} để xác nhận việc xóa." priorities: edit: priority_color_text: | - Nhấp để chỉ định hoặc thay đổi màu của mức ưu tiên này. - Có thể sử dụng để làm nổi bật các gói công việc trong bảng. + Nhấn vào đây để gán hoặc thay đổi màu sắc của mức độ ưu tiên này. + Nó có thể được sử dụng để làm nổi bật các gói công việc trong bảng. admin: default: - caption: Making this priority default will override the previous default priority. + caption: Đặt mức độ ưu tiên này làm mặc định sẽ ghi đè mức độ ưu tiên mặc định trước đó. reactions: - action_title: "React" - add_reaction: "Add reaction" - react_with: "React with %{reaction}" - and_user: "and %{user}" + action_title: "phản ứng" + add_reaction: "Thêm phản ứng" + react_with: "Phản ứng với %{reaction}" + and_user: "và %{user}" and_others: - other: và %{count} nữa - reaction_by: "%{reaction} by" + other: và %{count} người khác + reaction_by: "%{reaction} bởi" reportings: index: no_results_title_text: Hiện tại không có báo cáo trạng thái. - no_results_content_text: Thêm một báo cáo trạng thái + no_results_content_text: Thêm báo cáo trạng thái statuses: edit: status_color_text: | - Nhấp để gán hoặc thay đổi màu của trạng thái này. - Nó được hiển thị trên nút trạng thái và có thể được sử dụng để làm nổi bật các gói công việc trong bảng. + Nhấn vào đây để gán hoặc thay đổi màu sắc của trạng thái này. + Nó được hiển thị trong nút trạng thái và có thể được sử dụng để đánh dấu các gói công việc trong bảng. status_default_text: |- - New work packages are by default set to this type. They cannot be read-only. + Các gói công việc mới theo mặc định được đặt thành loại này. Chúng không thể ở chế độ chỉ đọc. status_excluded_from_totals_text: |- - Đánh dấu tùy chọn này để loại trừ các gói công việc có trạng thái này khỏi tổng số Công việc, - Công việc còn lại, và % Hoàn thành trong một cấu trúc phân cấp. + Chọn tùy chọn này để loại trừ các gói công việc có trạng thái này khỏi tổng số Công việc, + Công việc còn lại và % Hoàn thành theo thứ bậc. status_percent_complete_text: |- - In status-based progress calculation mode, the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + Trong chế độ tính toán tiến độ dựa trên trạng thái, phần trăm hoàn thành của gói công việc sẽ được tự động đặt thành giá trị này khi trạng thái này được chọn. Tỷ lệ hoàn thành dựa trên công việc bị bỏ qua trong chế độ dựa trên công việc. status_readonly_html: | - Check this option to mark work packages with this status as read-only. - No attributes can be changed with the exception of the status. + Chọn tùy chọn này để đánh dấu các gói công việc có trạng thái này là chỉ đọc. + Không có thuộc tính nào có thể được thay đổi ngoại trừ trạng thái.
    - Note: Inherited values (e.g., from children or relations) will still apply. + Lưu ý: Các giá trị được kế thừa (ví dụ: từ con cái hoặc quan hệ) sẽ vẫn được áp dụng. index: - no_results_title_text: Hiện tại không có trạng thái gói công việc nào. + no_results_title_text: Hiện tại không có trạng thái gói công việc. no_results_content_text: Thêm trạng thái mới headers: - is_default: "Mặc định" - is_closed: "Đã đóng" + is_default: "mặc định" + is_closed: "đóng cửa" is_readonly: "Chỉ đọc" - excluded_from_totals: "Loại trừ khỏi tổng số" + excluded_from_totals: "Bị loại trừ khỏi tổng số" themes: - dark: "Dark" - light: "Sáng" - sync_with_os: "Automatic (match OS color mode)" + dark: "Tối" + light: "ánh sáng" + sync_with_os: "Tự động (khớp với chế độ màu của hệ điều hành)" types: index: no_results_title_text: Hiện tại không có loại nào. no_results_content_text: Tạo loại mới edit: form_configuration: - tab: "Mẫu cấu hình" + tab: "Cấu hình biểu mẫu" projects: - tab: Các dự án - enable_all: Enable for all projects - select_projects: Select projects - select_projects_description: Select the projects in which you would like to use this type. + tab: dự án + enable_all: Kích hoạt cho tất cả các dự án + select_projects: Chọn dự án + select_projects_description: Chọn các dự án mà bạn muốn sử dụng loại này. settings: - tab: "Cài đặt" - type_color_text: The selected color distinguishes different types in Gantt charts or work packages tables. It is therefore recommended to use a strong color. + tab: "cài đặt" + type_color_text: Màu được chọn sẽ phân biệt các loại khác nhau trong biểu đồ Gantt hoặc bảng gói công việc. Do đó, nên sử dụng màu sắc mạnh mẽ. subject_configuration: - tab: "Subject configuration" + tab: "Cấu hình chủ đề" manually_editable_subjects: - label: "Manually editable subjects" - caption: "Users can manually enter and edit work package subjects without restrictions." + label: "Các chủ đề có thể chỉnh sửa thủ công" + caption: "Người dùng có thể nhập và chỉnh sửa chủ đề gói công việc theo cách thủ công mà không bị hạn chế." automatically_generated_subjects: - label: "Automatically generated subjects" - caption: "Define a pattern using referenced attributes and text to automatically generate work package subjects. Users will not be able to manually edit subjects." + label: "Chủ đề được tạo tự động" + caption: "Xác định mẫu bằng cách sử dụng các thuộc tính và văn bản được tham chiếu để tự động tạo chủ đề gói công việc. Người dùng sẽ không thể chỉnh sửa chủ đề theo cách thủ công." token: label_with_context: "%{attribute_context}: %{attribute_label}" context: - work_package: "Work Package" - parent: "Cha" - project: "Dự án" + work_package: "Gói công việc" + parent: "cha mẹ" + project: "dự án" pattern: - label: "Subject pattern" - caption: Create patterns by adding text, or type "/" to search for [supported attributes](attributes_url). - insert_as_text: 'No attributes found. Add as text: "%{word}"' + label: "mẫu chủ đề" + caption: Tạo mẫu bằng cách thêm văn bản hoặc nhập "/" để tìm kiếm [supported attributes](attributes_url). + insert_as_text: 'Không tìm thấy thuộc tính nào. Thêm dưới dạng văn bản: "%{word}"' export_configuration: - tab: "Generate PDF" - intro: "Select which templates from those that are available you would like to enable for this type. The template determines the design and attributes visible in the exported PDF of a work package using this type. The first template on the list is selected by default." + tab: "Tạo PDF" + intro: "Chọn mẫu nào trong số những mẫu có sẵn mà bạn muốn bật cho loại này. Mẫu xác định thiết kế và các thuộc tính hiển thị trong tệp PDF đã xuất của gói công việc sử dụng loại này. Mẫu đầu tiên trong danh sách được chọn theo mặc định." pdf_export_templates: - label: "PDF Export templates" + label: "Mẫu xuất PDF" actions: - label_enable_all: "Bật tất cả" - label_disable_all: "Tắt tất cả" + label_enable_all: "Kích hoạt tất cả" + label_disable_all: "Vô hiệu hóa tất cả" versions: overview: - work_packages_in_archived_projects: "Phiên bản này được chia sẻ với các dự án đã lưu trữ vẫn có gói công việc được gán cho phiên bản này. Những gói công việc này được tính, nhưng sẽ không xuất hiện trong các chế độ xem liên kết." + work_packages_in_archived_projects: "Phiên bản này được chia sẻ với các dự án đã lưu trữ vẫn có các gói công việc được gán cho phiên bản này. Những nội dung này được tính nhưng sẽ không xuất hiện trong các chế độ xem được liên kết." no_results_title_text: Hiện tại không có gói công việc nào được gán cho phiên bản này. wiki: - page_not_editable_index: Trang yêu cầu không (chưa) tồn tại. Bạn đã được chuyển hướng đến chỉ mục của tất cả các trang wiki. + page_not_editable_index: Trang được yêu cầu không (chưa) tồn tại. Bạn đã được chuyển hướng đến chỉ mục của tất cả các trang wiki. no_results_title_text: Hiện tại không có trang wiki nào. - print_hint: Điều này sẽ in nội dung của trang wiki này mà không có bất kỳ thanh điều hướng nào. + print_hint: Thao tác này sẽ in nội dung của trang wiki này mà không có bất kỳ thanh điều hướng nào. index: no_results_content_text: Thêm một trang wiki mới workflows: form: - matrix_caption: "Workflow matrix" - matrix_caption_assignee: "Workflow matrix for assignee" - matrix_caption_author: "Workflow matrix for author" - matrix_checkbox_label: "Allow transition from %{old_status} to %{new_status}" - matrix_check_all_label: "Allow all transitions" - matrix_uncheck_all_label: "Disallow all transitions" - matrix_check_uncheck_all_in_row_label_html: "Toggle transitions from %{old_status} to all new statuses" - matrix_check_uncheck_all_in_col_label_html: "Toggle transitions from all old statuses to %{new_status}" + matrix_caption: "Ma trận quy trình công việc" + matrix_caption_assignee: "Ma trận quy trình công việc cho người được giao" + matrix_caption_author: "Ma trận quy trình làm việc cho tác giả" + matrix_checkbox_label: "Cho phép chuyển đổi từ %{old_status} sang %{new_status}" + matrix_check_all_label: "Cho phép tất cả các chuyển tiếp" + matrix_uncheck_all_label: "Không cho phép tất cả các chuyển đổi" + matrix_check_uncheck_all_in_row_label_html: "Chuyển đổi các chuyển đổi từ %{old_status} sang tất cả các trạng thái mới" + matrix_check_uncheck_all_in_col_label_html: "Chuyển đổi trạng thái từ tất cả các trạng thái cũ sang %{new_status}" work_flows: index: no_results_title_text: Hiện tại không có quy trình làm việc nào. @@ -942,181 +967,181 @@ vi: datepicker_modal: banner: description: - automatic_mobile: "Start date derived." - click_on_show_relations_to_open_gantt: 'Click on "%{button_name}" for Gantt overview.' - manual_mobile: "Ignoring relations." - manual_gap_between_predecessors: "There is a gap between this and all predecessors." - manual_overlap_with_predecessors: "Overlaps with at least one predecessor." - manual_with_children: "This has child work packages but their start dates are ignored." + automatic_mobile: "Ngày bắt đầu bắt nguồn." + click_on_show_relations_to_open_gantt: 'Nhấp vào "%{button_name}" để xem tổng quan về Gantt.' + manual_mobile: "Bỏ qua các mối quan hệ." + manual_gap_between_predecessors: "Có một khoảng cách giữa điều này và tất cả những người đi trước." + manual_overlap_with_predecessors: "Trùng lặp với ít nhất một người tiền nhiệm." + manual_with_children: "Điều này có các gói công việc con nhưng ngày bắt đầu của chúng bị bỏ qua." title: - automatic_mobile: "Automatically scheduled." - automatic_with_children: "The dates are determined by child work packages." - automatic_with_predecessor: "The start date is set by a predecessor." - manual_mobile: "Manually scheduled." - manually_scheduled: "Manually scheduled. Dates not affected by relations." + automatic_mobile: "Tự động lên lịch." + automatic_with_children: "Ngày được xác định bởi các gói công việc trẻ em." + automatic_with_predecessor: "Ngày bắt đầu do người tiền nhiệm ấn định." + manual_mobile: "Lên lịch thủ công." + manually_scheduled: "Lên lịch thủ công. Ngày không bị ảnh hưởng bởi các mối quan hệ." blankslate: - title: "No predecessors" - description: "To enable automatic scheduling, this work package needs to have at least one predecessor. It will then automatically be scheduled to start after the closest predecessor." + title: "Không có người tiền nhiệm" + description: "Để kích hoạt tính năng lập lịch trình tự động, gói công việc này cần phải có ít nhất một gói công việc trước đó. Sau đó, nó sẽ tự động được lên lịch để bắt đầu sau phiên bản trước gần nhất." ignore_non_working_days: title: "Chỉ ngày làm việc" mode: - title: "Scheduling mode" - automatic: "Tự động" - manual: "Manual" - show_relations: "Hiển thị các mối quan hệ" - update_inputs_aria_live_message: "Date picker updated. %{message}" + title: "Chế độ lập lịch" + automatic: "tự động" + manual: "hướng dẫn sử dụng" + show_relations: "Hiển thị mối quan hệ" + update_inputs_aria_live_message: "Đã cập nhật bộ chọn ngày. %{message}" tabs: - aria_label: "Datepicker tabs" - children: "Con" - dates: "Dates" - predecessors: "Predecessors" - successors: "Successors" + aria_label: "Tab chọn ngày" + children: "bọn trẻ" + dates: "ngày tháng" + predecessors: "Người tiền nhiệm" + successors: "người kế nhiệm" blankslate: predecessors: - title: "No predecessors" - description: "This work package does not have any predecessors." + title: "Không có người tiền nhiệm" + description: "Gói công việc này không có gói công việc nào trước đó." successors: - title: "No successors" - description: "This work package does not have any successors." + title: "Không có người kế nhiệm" + description: "Gói công việc này không có phần kế thừa nào." children: - title: "No children" - description: "This work package does not have any children." + title: "Không có con" + description: "Gói công việc này không có con." x_descendants: other: "%{count} gói sản phẩm phụ thuộc" bulk: copy_failed: "Các gói công việc không thể được sao chép." move_failed: "Các gói công việc không thể được di chuyển." could_not_be_saved: "Không thể lưu các gói công việc sau:" - none_could_be_saved: "Không có gói công việc nào trong số %{total} có thể được cập nhật." - x_out_of_y_could_be_saved: "%{failing} trong số %{total} gói công việc không thể được cập nhật trong khi %{success} thì có thể." - selected_because_descendants: "While %{selected} work packages were selected, in total %{total} work packages are affected which includes descendants." - descendant: "gói công việc kế thừa của được chọn" + none_could_be_saved: "Không có gói công việc %{total} nào có thể được cập nhật." + x_out_of_y_could_be_saved: "Không thể cập nhật %{failing} trong số %{total} gói công việc trong khi %{success} thì có thể." + selected_because_descendants: "Mặc dù các gói công việc %{selected} đã được chọn nhưng tổng số các gói công việc %{total} đều bị ảnh hưởng, bao gồm cả các gói công việc con." + descendant: "hậu duệ của người được chọn" move: no_common_statuses_exists: "Có là tình trạng không có sẵn cho tất cả các gói đã chọn công việc. Tình trạng của họ không thể thay đổi." - unsupported_for_multiple_projects: "Di chuyển/ sao chép hàng loạt không được hỗ trợ cho các gói công việc từ nhiều dự án" + unsupported_for_multiple_projects: "Di chuyển/sao chép hàng loạt không được hỗ trợ cho các gói công việc từ nhiều dự án" current_type_not_available_in_target_project: > - Loại hiện tại của gói công việc không được kích hoạt trong dự án mục tiêu. Vui lòng kích hoạt loại trong dự án mục tiêu nếu bạn muốn chúng không thay đổi. Nếu không, loại của gói công việc sẽ được tự động gán lại dẫn đến mất dữ liệu tiềm ẩn. + Loại gói công việc hiện tại không được kích hoạt trong dự án mục tiêu. Vui lòng bật loại trong dự án mục tiêu nếu bạn muốn nó không thay đổi. Nếu không, hãy chọn loại có sẵn trong dự án mục tiêu từ danh sách. bulk_current_type_not_available_in_target_project: > - Các loại hiện tại của các gói công việc không được kích hoạt trong dự án mục tiêu. Vui lòng kích hoạt các loại trong dự án mục tiêu nếu bạn muốn chúng không thay đổi. Nếu không, các loại của gói công việc sẽ được tự động gán lại dẫn đến mất dữ liệu tiềm ẩn. + Các loại gói công việc hiện tại không được kích hoạt trong dự án mục tiêu. Vui lòng kích hoạt các loại trong dự án mục tiêu nếu bạn muốn chúng không thay đổi. Nếu không, hãy chọn loại có sẵn trong dự án mục tiêu từ danh sách. sharing: missing_workflow_warning: - title: "Thiếu quy trình làm việc cho việc chia sẻ gói công việc" - message: "Không có quy trình làm việc nào được cấu hình cho vai trò 'Biên tập viên gói công việc'. Không có quy trình làm việc, người được chia sẻ không thể thay đổi trạng thái của gói công việc. Các quy trình làm việc có thể được sao chép. Chọn một loại nguồn (ví dụ: 'Nhiệm vụ') và vai trò nguồn (ví dụ: 'Thành viên'). Sau đó chọn các loại mục tiêu. Để bắt đầu, bạn có thể chọn tất cả các loại làm mục tiêu. Cuối cùng, chọn vai trò 'Biên tập viên gói công việc' làm mục tiêu và nhấp vào 'Sao chép'. Sau khi đã tạo ra các mặc định như vậy, tinh chỉnh các quy trình làm việc như bạn làm với mọi vai trò khác." - link_message: "Cấu hình các quy trình làm việc trong quản trị." - templated_subject_hint: Automatically generated through type %{type} + title: "Thiếu luồng công việc để chia sẻ gói công việc" + message: "Không có quy trình làm việc nào được định cấu hình cho vai trò 'Trình chỉnh sửa gói công việc'. Nếu không có quy trình làm việc, nội dung được chia sẻ với người dùng không thể thay đổi trạng thái của gói công việc. Quy trình làm việc có thể được sao chép. Chọn loại nguồn (ví dụ: 'Nhiệm vụ') và vai trò nguồn (ví dụ: 'Thành viên'). Sau đó chọn loại mục tiêu. Để bắt đầu, bạn có thể chọn tất cả các loại làm mục tiêu. Cuối cùng, chọn vai trò 'Trình chỉnh sửa gói công việc' làm mục tiêu và nhấn 'Sao chép'. Sau khi đã tạo các giá trị mặc định, hãy tinh chỉnh quy trình làm việc như bạn thực hiện với mọi vai trò khác." + link_message: "Cấu hình các quy trình công việc trong quản trị." + templated_subject_hint: Được tạo tự động thông qua loại %{type} summary: reports: category: no_results_title_text: Hiện tại không có danh mục nào có sẵn. assigned_to: - no_results_title_text: Hiện có không có thành viên của dự án này. + no_results_title_text: Hiện tại không có thành viên nào tham gia dự án này. responsible: - no_results_title_text: Hiện có không có thành viên của dự án này. + no_results_title_text: Hiện tại không có thành viên nào tham gia dự án này. author: - no_results_title_text: Hiện có không có thành viên của dự án này. + no_results_title_text: Hiện tại không có thành viên nào tham gia dự án này. priority: - no_results_title_text: Hiện tại không có mức ưu tiên nào có sẵn. + no_results_title_text: Hiện tại không có ưu tiên nào. type: no_results_title_text: Không có phân loại. version: no_results_title_text: Hiện tại không sẵn có phiên bản nào. work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_child_button: "Child" - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" - label_add_description: "Add description" + action_bar_title: "Thêm quan hệ vào các gói công việc khác để tạo liên kết giữa chúng." + no_results_title_text: Hiện tại chưa có mối quan hệ nào. + blankslate_heading: "Không có quan hệ" + blankslate_description: "Gói công việc này chưa có bất kỳ mối quan hệ nào." + label_add_child_button: "đứa trẻ" + label_add_x: "Thêm %{x}" + label_edit_x: "Chỉnh sửa %{x}" + label_add_description: "Thêm mô tả" lag: - subject: "Kết quả chậm" + subject: "Độ trễ" caption: |- - The minimum number of working days to keep in between the two work packages. - It can also be negative. + Số ngày làm việc tối thiểu cần giữ giữa hai gói công việc. + Nó cũng có thể là tiêu cực. relations: - label_new_child_created: "New work package created and added as a child" + label_new_child_created: "Gói công việc mới được tạo và thêm khi còn nhỏ" label_relates_singular: "liên quan đến" label_relates_plural: "liên quan đến" label_relates_to_singular: "liên quan đến" label_relates_to_plural: "liên quan đến" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" + relates_description: "Tạo liên kết hiển thị giữa hai gói công việc mà không có tác dụng bổ sung" + relates_to_description: "Tạo liên kết hiển thị giữa hai gói công việc mà không có tác dụng bổ sung" + label_precedes_singular: "người kế vị (sau)" + label_precedes_plural: "người kế vị (sau)" + precedes_description: "Gói công việc liên quan nhất thiết phải bắt đầu sau khi gói công việc này kết thúc" + label_follows_singular: "người tiền nhiệm (trước đây)" + label_follows_plural: "người tiền nhiệm (trước đây)" + follows_description: "Gói công việc liên quan nhất thiết phải hoàn thành trước khi gói công việc này có thể bắt đầu" + label_child_singular: "đứa trẻ" + label_child_plural: "bọn trẻ" new_child: "Tạo con mới" - new_child_description: "Creates a related work package as a sub-item of the current (parent) work package" - child: "Child" - child_description: "Makes the related work package a sub-item of the current (parent) work package" - parent: "Cha" - parent_description: "Makes the related work package a parent of the current (child) work package" - label_closest: "Closest" - label_blocks_singular: "các khối" - label_blocks_plural: "các khối" - blocks_description: "The related work package cannot be closed until this one is closed first" + new_child_description: "Tạo gói công việc liên quan dưới dạng mục con của gói công việc (cha) hiện tại" + child: "đứa trẻ" + child_description: "Làm cho gói công việc liên quan trở thành một mục con của gói công việc (mẹ) hiện tại" + parent: "cha mẹ" + parent_description: "Biến gói công việc liên quan thành cha của gói công việc (con) hiện tại" + label_closest: "Gần nhất" + label_blocks_singular: "khối" + label_blocks_plural: "khối" + blocks_description: "Không thể đóng gói công việc liên quan cho đến khi gói công việc này được đóng trước" label_blocked_singular: "bị chặn bởi" label_blocked_plural: "bị chặn bởi" label_blocked_by_singular: "bị chặn bởi" label_blocked__by_plural: "bị chặn bởi" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "Nhân đôi" - label_duplicates_plural: "Nhân đôi" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "bị trùng bởi" - label_duplicated_plural: "bị trùng bởi" - label_duplicated_by_singular: "bị trùng bởi" - label_duplicated_by_plural: "bị trùng bởi" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" + blocked_description: "Gói công việc này không thể được đóng cho đến khi gói công việc liên quan được đóng trước" + blocked_by_description: "Gói công việc này không thể được đóng cho đến khi gói công việc liên quan được đóng trước" + label_duplicates_singular: "trùng lặp" + label_duplicates_plural: "trùng lặp" + duplicates_description: "Đây là bản sao của gói công việc liên quan" + label_duplicated_singular: "nhân đôi bởi" + label_duplicated_plural: "nhân đôi bởi" + label_duplicated_by_singular: "nhân đôi bởi" + label_duplicated_by_plural: "nhân đôi bởi" + duplicated_by_description: "Gói công việc liên quan là bản sao của gói công việc này" + duplicated_description: "Gói công việc liên quan là bản sao của gói công việc này" label_includes_singular: "bao gồm" label_includes_plural: "bao gồm" - includes_description: "Marks the related work package as including this one with no additional effect" + includes_description: "Đánh dấu gói công việc liên quan là bao gồm gói này mà không có tác dụng bổ sung" label_partof_singular: "một phần của" label_partof_plural: "một phần của" label_part_of_singular: "một phần của" label_part_of_plural: "một phần của" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" - label_requires_singular: "bắt buộc" - label_requires_plural: "bắt buộc" - requires_description: "Marks the related work package as a requirement to this one" - label_required_singular: "required by" - label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" - label_parent_singular: "parent" - label_parent_plural: "parent" - label_other_relations: "Other relations" - ghost_relation_title: "Work package liên quan" - ghost_relation_description: "This is not visible to you due to permissions." + partof_description: "Đánh dấu gói công việc liên quan là một phần của gói này mà không có tác dụng bổ sung" + part_of_description: "Đánh dấu gói công việc liên quan là một phần của gói này mà không có tác dụng bổ sung" + label_requires_singular: "Yêu cầu" + label_requires_plural: "Yêu cầu" + requires_description: "Đánh dấu gói công việc liên quan là yêu cầu đối với gói công việc này" + label_required_singular: "được yêu cầu bởi" + label_required_plural: "được yêu cầu bởi" + required_description: "Đánh dấu gói công việc này là một yêu cầu đối với gói công việc liên quan" + label_parent_singular: "cha mẹ" + label_parent_plural: "cha mẹ" + label_other_relations: "Các mối quan hệ khác" + ghost_relation_title: "Gói công việc liên quan" + ghost_relation_description: "Điều này không hiển thị với bạn do quyền." label_invitation: Thư mời account: delete: "Xoá tài khoản" delete_confirmation: "Bạn có chắc chắn muốn xoá tài khoản chứ?" - deletion_pending: "Account has been scheduled for deletion. Note that this process takes place in the background. It might take a few moments until the user is fully deleted." + deletion_pending: "Tài khoản đã được lên lịch xóa. Lưu ý rằng quá trình này diễn ra ở chế độ nền. Có thể mất vài phút cho đến khi người dùng bị xóa hoàn toàn." deletion_info: data_consequences: - other: "All user-specific data will be deleted. The user's activity in shared views such as work packages and meetings will not be deleted but instead be associated with a generic 'Deleted user' that cannot be linked to the original account." - self: "All user-specific data will be deleted. Your activity in shared views such as work packages and meetings will not be deleted but instead be associated with a generic 'Deleted user' that cannot be linked to your original account." - heading: "Delete %{name}'s account?" + other: "Tất cả dữ liệu cụ thể của người dùng sẽ bị xóa. Hoạt động của người dùng trong các chế độ xem được chia sẻ như gói công việc và cuộc họp sẽ không bị xóa mà thay vào đó sẽ được liên kết với một 'Người dùng đã xóa' chung không thể liên kết với tài khoản ban đầu." + self: "Tất cả dữ liệu cụ thể của người dùng sẽ bị xóa. Hoạt động của bạn trong các chế độ xem được chia sẻ như gói công việc và cuộc họp sẽ không bị xóa mà thay vào đó sẽ được liên kết với một 'Người dùng đã xóa' chung không thể liên kết với tài khoản ban đầu của bạn." + heading: "Xóa tài khoản của %{name}?" login_consequences: - other: "This account will immediately be removed from the system and the user will no longer be able to log in with their credentials." - self: "Your account will immediately be removed from the system and you will no longer be able to log in using your credentials." + other: "Tài khoản này sẽ ngay lập tức bị xóa khỏi hệ thống và người dùng sẽ không thể đăng nhập bằng thông tin đăng nhập của mình nữa." + self: "Tài khoản của bạn sẽ ngay lập tức bị xóa khỏi hệ thống và bạn sẽ không thể đăng nhập bằng thông tin đăng nhập của mình nữa." error_inactive_activation_by_mail: > - Tài khoản của bạn đã không được nêu ra được kích hoạt. Để kích hoạt tài khoản của bạn, nhấp vào liên kết được gửi đến bạn. + Tài khoản của bạn vẫn chưa được kích hoạt. Để kích hoạt tài khoản của bạn, hãy nhấp vào liên kết được gửi qua email cho bạn. error_inactive_manual_activation: > Tài khoản của bạn đã không được nêu ra được kích hoạt. Xin vui lòng chờ cho người quản trị để kích hoạt tài khoản của bạn. error_self_registration_disabled: > Đăng ký người dùng bị vô hiệu hóa trên hệ thống này. Xin vui lòng hỏi người quản trị để tạo ra một tài khoản cho bạn. error_self_registration_limited_provider: > - Đăng ký người dùng bị hạn chế cho nhà cung cấp Đăng nhập một lần '%{name}'. Vui lòng yêu cầu quản trị viên kích hoạt tài khoản của bạn hoặc thay đổi giới hạn đăng ký tự động cho nhà cung cấp này. + Đăng ký người dùng bị giới hạn đối với nhà cung cấp dịch vụ đăng nhập một lần '%{name}'. Vui lòng yêu cầu quản trị viên kích hoạt tài khoản cho bạn hoặc thay đổi giới hạn tự đăng ký cho nhà cung cấp này. login_with_auth_provider: "hoặc đăng nhập bằng tài khoản hiện tại" signup_with_auth_provider: "hoặc sử dụng đăng ký" auth_source_login: Vui lòng đăng nhập với %{login} để kích hoạt tài khoản của bạn. @@ -1125,7 +1150,7 @@ vi: activemodel: attributes: projects/copy_options: - dependencies: "Phụ thuộc" + dependencies: "phụ thuộc" activerecord: attributes: announcements: @@ -1133,42 +1158,42 @@ vi: attachment: attachment_content: "Số lượng Tệp đính kèm" attachment_file_name: "Tên tập tin đính kèm" - content_type: "Content-type" + content_type: "Loại nội dung" downloads: "Những mục đã tải xuống" - file: "Tệp" + file: "tập tin" filename: "Tệp" filesize: "Kích cỡ" attribute_help_text: attribute_name: "Thuộc tính" help_text: "Văn bản trợ giúp" - caption: "Caption" + caption: "chú thích" auth_provider: - scim_clients: "SCIM clients" + scim_clients: "khách hàng SCIM" calculated_value_error: - error_code: "Error code" - customized: "Customized" - customized_id: "Customized ID" - customized_type: "Customized type" + error_code: "Mã lỗi" + customized: "tùy chỉnh" + customized_id: "ID tùy chỉnh" + customized_type: "Loại tùy chỉnh" capability: - context: "Context" + context: "Bối cảnh" changeset: repository: "Kho lưu trữ" comment: commented: "Nhận xét" #an object that this comment belongs to custom_action: - actions: "Hành động" + actions: "hành động" custom_field: allow_non_open_versions: "Cho phép các phiên bản không mở" default_value: "Giá trị mặc định" editable: "Có thể chỉnh sửa" field_format: "Định dạng" - formula: "Formula" + formula: "Công thức" is_filter: "Dùng như bộ lọc" - is_for_all: "Cho tất cả các dự án" + is_for_all: "Đối với tất cả các dự án" is_required: "Bắt buộc" max_length: "Chiều dài tối đa" min_length: "Chiều dài tối thiểu" - content_right_to_left: "Right-to-Left content" + content_right_to_left: "Nội dung từ phải sang trái" multi_value: "Cho phép nhiều lựa chọn" possible_values: "Giá trị có thể" regexp: "Biểu thức chính quy" @@ -1177,30 +1202,30 @@ vi: custom_value: value: "Giá trị" design_color: - variable: "Variable" + variable: "Biến" doorkeeper/application: uid: "ID Khách hàng" secret: "Bí mật khách hàng" owner: "Người sở hữu" - builtin: "Builtin" + builtin: "Nội dung" enabled: "Đang hoạt động" redirect_uri: "URI đổi hướng" - client_credentials_user_id: "ID người dùng thông tin xác thực của khách hàng" + client_credentials_user_id: "ID người dùng thông tin xác thực khách hàng" scopes: "Phạm vi" confidential: "Bí mật" emoji_reaction: - reactable: "Reacted on" + reactable: "Đã phản hồi trên" enterprise_token: starts_at: "Có hiệu lực kể từ" subscriber: "Người đăng ký" - subscription: "Đăng ký" - plan: "Gói dịch vụ" + subscription: "đăng ký" + plan: "kế hoạch" encoded_token: "Mã thông báo hỗ trợ doanh nghiệp" - active_user_count_restriction: "Active users" + active_user_count_restriction: "Người dùng đang hoạt động" enterprise_trial: - company: "Công ty" + company: "công ty" favorite: - favorited: "Item" + favorited: "mục" grids/grid: page: "Trang" row_count: "Số dòng" @@ -1208,204 +1233,208 @@ vi: widgets: "Tiện ích" journal: notes: "Ghi chú" - cause_type: "Cause type" + cause_type: "Loại nguyên nhân" ldap_auth_source: - account: "Tài khoản" + account: "tài khoản" attr_firstname: "Thuộc tính tên" attr_lastname: "Thuộc tính Họ" attr_login: "Thuộc tính tên người dùng" attr_mail: "Thuộc tính Email" - filter_string: "Filter string" - admin: "Người Quản lý" - base_dn: "DN căn bản" - host: "Máy chủ" + filter_string: "Chuỗi bộ lọc" + admin: "quản trị viên" + base_dn: "DN cơ sở" + host: "chủ nhà" onthefly: "Tự động tạo người dùng" - port: "Cổng" + port: "hải cảng" tls_certificate_string: "Chứng chỉ SSL của máy chủ LDAP" + mcp_configuration: + enabled: Đã bật + title: Tiêu đề + description: Mô tả member: roles: "Vai trò" notification: - read_ian: "Read in-app" - resource: "Resource" + read_ian: "Đọc trong ứng dụng" + resource: "tài nguyên" oauth_client: client: "ID người dùng" project: active_value: - true: "chưa lưu trữ" + true: "không được lưu trữ" false: "đã lưu trữ" - attribute_groups: "Attribute Groups" - description: "Mô tả" + attribute_groups: "Nhóm thuộc tính" + description: "mô tả" enabled_modules: "Các mô-đun đã bật" identifier: "Định danh" latest_activity_at: "Các hoạt động mới nhất tại" parent: "Dự án con của" - project_creation_wizard_enabled: "Project initiation request" + project_creation_wizard_enabled: "Yêu cầu khởi tạo dự án" public_value: - title: "Hiển thị" + title: "Khả năng hiển thị" true: "công khai" false: "riêng tư" queries: "Truy vấn" - status_code: "Status" - status_explanation: "Status description" + status_code: "trạng thái" + status_explanation: "Mô tả trạng thái" status_codes: not_started: "Chưa bắt đầu" - on_track: "Đang tiến triển" + on_track: "Đang đi đúng hướng" at_risk: "Có nguy cơ" - off_track: "Bị lệch" - finished: "Hoàn thành" - discontinued: "Ngừng hoạt động" - project_creation_wizard_assignee_custom_field: "Assignee when submitted" - project_creation_wizard_notification_text: "Notification text" - project_creation_wizard_send_confirmation_email: "Confirmation email" - project_creation_wizard_status_when_submitted: "Status when submitted" - project_creation_wizard_work_package_comment: "Work package comment" - project_creation_wizard_work_package_type: "Work package type" - template: "Template" + off_track: "Lạc lối" + finished: "Đã hoàn thành" + discontinued: "Đã ngừng sản xuất" + project_creation_wizard_assignee_custom_field: "Người được chuyển nhượng khi nộp" + project_creation_wizard_notification_text: "Văn bản thông báo" + project_creation_wizard_send_confirmation_email: "Email xác nhận" + project_creation_wizard_status_when_submitted: "Trạng thái khi gửi" + project_creation_wizard_work_package_comment: "Nhận xét gói công việc" + project_creation_wizard_work_package_type: "Loại gói công việc" + template: "mẫu" templated: "Dự án mẫu" templated_value: true: "được đánh dấu là mẫu" - false: "không được đánh dấu là mẫu" + false: "đã bỏ đánh dấu là mẫu" types: "Các loại" versions: "Các phiên bản" work_packages: "Work Packages" - workspace_type: "Workspace type" + workspace_type: "Loại không gian làm việc" project_custom_field: - custom_field_section: Phần + custom_field_section: phần subproject_template_assignment: - workspace_type: "Workspace type" + workspace_type: "Loại không gian làm việc" project/phase: - date_range: "Khoảng thời gian" - definition: "Definition" - duration: "Thời gian" + date_range: "Phạm vi ngày" + definition: "độ nét" + duration: "thời lượng" start_date: "Ngày bắt đầu" - start_date_caption: "Follows the previous phase." + start_date_caption: "Tiếp theo giai đoạn trước." finish_date: "Ngày kết thúc" project/phase_definition: - name: "Tên" - color: "Màu sắc" - start_gate: "Start phase gate" - start_gate_name: "Start phase gate name" - finish_gate: "Finish phase gate" - finish_gate_name: "Finish phase gate name" + name: "tên" + color: "màu sắc" + start_gate: "Cổng pha bắt đầu" + start_gate_name: "Tên cổng giai đoạn bắt đầu" + finish_gate: "Cổng giai đoạn hoàn thiện" + finish_gate_name: "Tên cổng giai đoạn kết thúc" query: - sums: "Sums" + sums: "Tổng" columns: "Cột" column_names: "Cột" relations_to_type_column: "Quan hệ với %{type}" relations_of_type_column: "%{type} quan hệ" - child_work_packages: "Child work packages" + child_work_packages: "Gói công việc trẻ em" group_by: "Nhóm kết quả bởi" - sort_by: "Sort results by" + sort_by: "Sắp xếp kết quả theo" filters: "Bộ lọc" timeline_labels: "Nhãn dòng thời gian" - timeline_visible: "Xem biểu đồ sự kiện" - timeline_zoom_level: "Gantt chart zoom level" - timestamps: "Baseline timestamps" - sort_criteria: "Sort criteria" - highlighted_attributes: "Highlighted attributes" - highlighting_mode: "Highlight mode" - display_representation: "Display mode" - show_hierarchies: "Display mode" - starred: "Yêu thích" - hidden: "Hidden" - manual_sorting: "Manual sort order" - ordered_work_packages: "Work packages order" - include_subprojects: "Bao gồm dự án con" - results: "Các kết quả" + timeline_visible: "Hiển thị biểu đồ Gantt" + timeline_zoom_level: "Mức thu phóng biểu đồ Gantt" + timestamps: "Dấu thời gian cơ sở" + sort_criteria: "Sắp xếp tiêu chí" + highlighted_attributes: "Thuộc tính nổi bật" + highlighting_mode: "Chế độ đánh dấu" + display_representation: "Chế độ hiển thị" + show_hierarchies: "Chế độ hiển thị" + starred: "yêu thích" + hidden: "Ẩn" + manual_sorting: "Thứ tự sắp xếp thủ công" + ordered_work_packages: "Đặt hàng gói công việc" + include_subprojects: "Bao gồm các tiểu dự án" + results: "kết quả" relation: - lag: "Kết quả chậm" - from: "Work package liên quan" + lag: "Độ trễ" + from: "Gói công việc liên quan" to: "Work package liên quan" - relation_type: "Relation type" + relation_type: "Kiểu quan hệ" reminder: - remindable: "Reminded object" - remind_at: "Remind at" - remind_at_date: "Ngày" - remind_at_time: "Thời gian" + remindable: "Đối tượng được nhắc nhở" + remind_at: "Nhắc nhở vào lúc" + remind_at_date: "ngày" + remind_at_time: "thời gian" reminder_notification: - notification: "Notification" + notification: "thông báo" repository: url: "Đường dẫn (URL)" role: - permissions: "Phân Quyền" + permissions: "quyền" scim_client: - authentication_method: "Authentication method" - jwt_sub: "Subject claim" + authentication_method: "Phương thức xác thực" + jwt_sub: "Chủ đề yêu cầu bồi thường" status: is_closed: "Work package đã đóng" is_readonly: "Work package chỉ đọc" - excluded_from_totals: "Loại trừ khỏi tính tổng trong phân cấp" + excluded_from_totals: "Loại trừ khỏi việc tính tổng theo thứ bậc" default_done_ratio: "% Hoàn thành" token/named: - token_name: "Token name" + token_name: "Tên mã thông báo" token/ical: - calendar: "Lịch" - ical_token_query_assignment: "Query assignment" + calendar: "lịch" + ical_token_query_assignment: "Phân công truy vấn" time_entry: activity: "Hoạt động" hours: "Giờ" spent_on: "Ngày" type: "Kiểu" - ongoing: "Đang diễn ra" + ongoing: "đang diễn ra" type: description: "Văn bản mặc định cho mô tả" - attribute_groups: "Mẫu cấu hình" + attribute_groups: "Cấu hình biểu mẫu" is_in_roadmap: "Hiển thị trong lộ trình mặc định" is_default: "Kích hoạt cho các dự án mới theo mặc định" - is_milestone: "Là cột mốc" + is_milestone: "Là cột mốc quan trọng" color: "Màu sắc" - patterns: "Patterns" + patterns: "mẫu" remote_identity: - auth_source: "Auth Source" - integration: "Integration" - user: "Người dùng" + auth_source: "Nguồn xác thực" + integration: "tích hợp" + user: "người dùng" user: admin: "Người Quản lý" auth_source: "Nguồn xác thực" ldap_auth_source: "Kết nối LDAP" - identity_url: "URL danh tính" + identity_url: "URL nhận dạng" current_password: "Mật khẩu hiện tại" force_password_change: "Buộc thay đổi mật khẩu trong lần đăng nhập tiếp theo" language: "Ngôn ngữ" last_login_on: "Lần đăng nhập trước" - failed_login_count: "Failed login attempts" + failed_login_count: "Số lần đăng nhập không thành công" first_name: "Tên" last_name: "Họ" - first_login: "First login" + first_login: "Đăng nhập lần đầu" new_password: "Mật khẩu mới" password_confirmation: "Xác nhận lại mật khẩu" consented_at: "Đồng ý tại" group: - identity_url: "URL danh tính" + identity_url: "URL nhận dạng" user_preference: - header_look_and_feel: "Look and feel" - header_alerts: "Alerts" - button_update_look_and_feel: "Update look and feel" - button_update_alerts: "Update alerts" - button_update_user_information: "Update profile" - comments_sorting: "Display work package activity sorted by" - disable_keyboard_shortcuts: "Disable keyboard shortcuts" + header_look_and_feel: "Nhìn và cảm nhận" + header_alerts: "cảnh báo" + button_update_look_and_feel: "Cập nhật giao diện" + button_update_alerts: "Cập nhật cảnh báo" + button_update_user_information: "Cập nhật hồ sơ" + comments_sorting: "Hiển thị hoạt động gói công việc được sắp xếp theo" + disable_keyboard_shortcuts: "Tắt phím tắt" disable_keyboard_shortcuts_caption_html: |- - You can choose to disable default keyboard shortcuts if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. - dismissed_enterprise_banners: "Hidden enterprise banners" + Bạn có thể tắt các phím tắt mặc định nếu bạn sử dụng trình đọc màn hình hoặc muốn tránh vô tình kích hoạt một hành động bằng phím tắt. + dismissed_enterprise_banners: "Biểu ngữ doanh nghiệp ẩn" impaired: "Viet nam" - auto_hide_popups: "Automatically hide success banners" - auto_hide_popups_caption: "When enabled, the green success banners will automatically disappear after 5 seconds." - warn_on_leaving_unsaved: "Cảnh báo tôi khi rời khỏi gói công việc với thay đổi chưa lưu" - increase_theme_contrast: "Increase theme contrast" - increase_contrast: "Increase contrast" - increase_contrast_caption: "Enables high-contrast mode for the chosen colour mode." - force_light_theme_contrast: "Force high-contrast when in Light mode" - force_dark_theme_contrast: "Force high-contrast when in Dark mode" - force_light_theme_contrast_caption: "Uses the high-contrast version of Light mode when automatic color mode is selected." - force_dark_theme_contrast_caption: "Uses the high-contrast version of Dark mode when automatic color mode is selected." - theme: "Color mode" + auto_hide_popups: "Tự động ẩn biểu ngữ thành công" + auto_hide_popups_caption: "Khi được bật, biểu ngữ thành công màu xanh sẽ tự động biến mất sau 5 giây." + warn_on_leaving_unsaved: "Cảnh báo tôi khi rời khỏi gói công việc có những thay đổi chưa được lưu" + increase_theme_contrast: "Tăng độ tương phản chủ đề" + increase_contrast: "Tăng độ tương phản" + increase_contrast_caption: "Bật chế độ tương phản cao cho chế độ màu đã chọn." + force_light_theme_contrast: "Buộc độ tương phản cao khi ở chế độ Ánh sáng" + force_dark_theme_contrast: "Buộc độ tương phản cao khi ở chế độ Tối" + force_light_theme_contrast_caption: "Sử dụng phiên bản có độ tương phản cao của Chế độ ánh sáng khi chế độ màu tự động được chọn." + force_dark_theme_contrast_caption: "Sử dụng phiên bản có độ tương phản cao của Chế độ tối khi chọn chế độ màu tự động." + theme: "Chế độ màu" time_zone: "Múi giờ" - mode_guideline: "Some modes will overwrite custom theme colors for accessibility and legibility. Please select Light mode for full custom theme support." - daily_reminders: "Daily reminders" + mode_guideline: "Một số chế độ sẽ ghi đè màu chủ đề tùy chỉnh để đảm bảo khả năng truy cập và mức độ dễ đọc. Vui lòng chọn Chế độ ánh sáng để được hỗ trợ chủ đề tùy chỉnh đầy đủ." + daily_reminders: "Lời nhắc hàng ngày" workdays: "Ngày làm việc" users/invitation/form_model: - principal_type: "Invitation type" + principal_type: "Loại lời mời" id_or_email: "Tên hoặc địa chỉ email" version: effective_date: "Ngày hoàn thành" @@ -1415,148 +1444,150 @@ vi: wiki_page: parent_title: "Trang mẹ" redirect_existing_links: "Chuyển hướng các liên kết hiện có" - text: "Page content" + text: "Nội dung trang" work_package: - ancestor: "Descendants of" #used for filtering of work packages that are descendants of a given work package + ancestor: "Hậu duệ của" #used for filtering of work packages that are descendants of a given work package begin_insertion: "Bắt đầu chèn" begin_deletion: "Bắt đầu xóa" children: "Subelements" derived_done_ratio: "Tổng % hoàn thành" - derived_remaining_hours: "Tổng thời gian còn lại" - derived_remaining_time: "Tổng số giờ còn lại" + derived_remaining_hours: "Tổng số công việc còn lại" + derived_remaining_time: "Tổng số công việc còn lại" done_ratio: "% Hoàn thành" - duration: "Thời gian" + duration: "thời lượng" end_insertion: "Kết thúc chèn" end_deletion: "Kết thúc quá trình xóa" - ignore_non_working_days: "Bỏ qua ngày không làm việc" + ignore_non_working_days: "Bỏ qua những ngày không làm việc" include_non_working_days: title: "Ngày làm việc" false: "chỉ ngày làm việc" - true: "bao gồm ngày không làm việc" - journal_internal: Internal Journal - notify: "Thông báo" #used in custom actions + true: "bao gồm những ngày không làm việc" + journal_internal: Tạp chí nội bộ + notify: "thông báo" #used in custom actions parent: "Cha" - parent_issue: "Cha" - parent_work_package: "Cha" + parent_issue: "cha mẹ" + parent_work_package: "cha mẹ" priority: "Độ ưu tiên" progress: "% Hoàn thành" readonly: "Chỉ đọc" remaining_hours: "Công việc còn lại" - remaining_time: "Thời gian còn lại" - shared_with_users: "Chia sẻ với" + remaining_time: "Công việc còn lại" + shared_with_users: "Được chia sẻ với" schedule_manually: "Lên lịch thủ công" - spent_hours: "Thời gian" + spent_hours: "dành thời gian" spent_time: "Thời gian" subproject: "Dự án con" time_entries: "Thời gian truy cập" - type: "Kiểu" + type: "loại" version: "Phiên bản" watcher: "Người quan sát" errors: messages: accepted: "phải được đồng ý" after: "phải sau %{date}" - after_today: "must be in the future." + after_today: "phải ở tương lai." after_or_equal_to: "phải sau hoặc tương đương với %{date}" before: "phải trước khi %{date}" before_or_equal_to: "phải có trước hay tương đương với %{date}" blank: "không được để trống" - blank_nested: "cần có thuộc tính '%{property}' được thiết lập." - cannot_delete_mapping: "là bắt buộc. Không thể xóa." - is_for_all_cannot_modify: "is for all projects and can therefore not be modified." - cant_link_a_work_package_with_a_descendant: "Một gói công việc không thể liên kết với một trong các nhiệm vụ con của nó." - circular_dependency: "Mối quan hệ này sẽ tạo ra một sự phụ thuộc tuần hoàn." + blank_nested: "cần phải đặt thuộc tính '%{property}'." + cannot_delete_mapping: "được yêu cầu. Không thể xóa được." + is_for_all_cannot_modify: "dành cho tất cả các dự án và do đó không thể sửa đổi được." + cant_link_a_work_package_with_a_descendant: "Một gói công việc không thể được liên kết với một trong các nhiệm vụ con của nó." + circular_dependency: "Mối quan hệ này sẽ tạo ra sự phụ thuộc vòng tròn." confirmation: "không khớp %{attribute}." - could_not_be_copied: "%{dependency} không thể được sao chép (hoàn toàn)." + could_not_be_copied: "%{dependency} không thể sao chép (đầy đủ)." does_not_exist: "không tồn tại" - error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." + error_enterprise_only: "%{action} chỉ có trong phiên bản OpenProject Enterprise." error_unauthorized: "Có thể không được truy cập." - error_readonly: "đã bị ghi lại nhưng không thể ghi." - error_conflict: "Thông tin đã được cập nhật bởi ít nhất một người dùng khác trong thời gian này." - error_not_found: "not found." - email: "không phải là địa chỉ email hợp lệ." + error_readonly: "đã được cố gắng viết nhưng không thể ghi được." + error_conflict: "Thông tin đã được cập nhật bởi ít nhất một người dùng khác trong thời gian chờ đợi." + error_not_found: "không tìm thấy." + email: "không phải là một địa chỉ email hợp lệ." empty: "không thể để trống" - enterprise_plan_required: "requires at least the %{plan_name}." - even: "phải là số chẵn." + enterprise_plan_required: "yêu cầu ít nhất %{plan_name}." + even: "phải chẵn." exclusion: "được bảo lưu." - feature_disabled: is not available. + feature_disabled: không có sẵn. + feature_disabled_for_project: đã bị vô hiệu hóa cho dự án này. file_too_large: "quá lớn (kích thước tối đa là %{count} bytes)" filter_does_not_exist: "bộ lọc không tồn tại." - format: "không khớp với định dạng mong đợi '%{expected}'." - format_nested: "không khớp với định dạng mong đợi '%{expected}' tại đường dẫn '%{path}'." + format: "không khớp với định dạng dự kiến ​​'%{expected}'." + format_nested: "không khớp với định dạng dự kiến ​​'%{expected}' tại đường dẫn '%{path}'." greater_than: "phải lớn hơn %{count}" greater_than_or_equal_to: "phải lớn hơn hoặc bằng %{count}" greater_than_or_equal_to_start_date: "phải lớn hơn hoặc bằng ngày bắt đầu." greater_than_start_date: "phải lớn hơn ngày bắt đầu." inclusion: "không nằm trong các giá trị cho phép" - inclusion_nested: "không được thiết lập thành một trong các giá trị được phép tại đường dẫn '%{path}'." + inclusion_nested: "không được đặt thành một trong các giá trị được phép tại đường dẫn '%{path}'." invalid: "không hợp lệ" invalid_url: "không phải là một URL hợp lệ." invalid_url_scheme: "không phải là giao thức được hỗ trợ (được phép: %{allowed_schemes})." less_than_or_equal_to: "phải nhỏ hơn hoặc bằng %{count}" - not_available: "không có sẵn do cấu hình hệ thống." - not_deletable: "không thể bị xóa." + not_available: "không khả dụng do cấu hình hệ thống." + not_deletable: "không thể xóa được." not_current_user: "không phải là người dùng hiện tại." - not_found: "not found." + not_found: "không tìm thấy." not_a_date: "không phải là ngày hợp lệ" not_a_datetime: "không phải là thời gian hợp lệ" not_a_number: "không phải là số" not_allowed: "không hợp lệ vì thiếu quyền." - not_json: "is not a valid JSON object." + not_json: "không thể phân tích cú pháp dưới dạng JSON." + not_json_object: "không phải là một đối tượng JSON." not_an_integer: "không phải là một số nguyên" not_an_iso_date: "không phải là một ngày hợp lệ. Yêu cầu định dạng: YYYY-MM-DD." not_same_project: "không thuộc cùng dự án." - datetime_must_be_in_future: "must be in the future." + datetime_must_be_in_future: "phải ở tương lai." odd: "phải là số lẻ" regex_match_failed: "không khớp với biểu thức chính quy %{expression}." regex_invalid: "có thể không được xác nhận với các biểu hiện thường xuyên liên kết." - regex_list_invalid: "Lines %{invalid_lines} could not be parsed as regular expression." - hexcode_invalid: "is not a valid 6-digit hexadecimal color code." + regex_list_invalid: "Không thể phân tích cú pháp các dòng %{invalid_lines} dưới dạng biểu thức chính quy." + hexcode_invalid: "không phải là mã màu thập lục phân 6 chữ số hợp lệ." smaller_than_or_equal_to_max_length: "phải nhỏ hơn hoặc bằng với chiều dài tối đa" taken: "đã bị dùng rồi." too_long: "quá dài (tối đa %{count} ký tự)." too_short: "quá ngắn (tối thiểu %{count} ký tự)." - type_mismatch: "không phải kiểu '%{type}'" - type_mismatch_nested: "không phải kiểu '%{type}' tại đường dẫn '%{path}'" + type_mismatch: "không thuộc loại '%{type}'" + type_mismatch_nested: "không thuộc loại '%{type}' tại đường dẫn '%{path}'" unchangeable: "không thể thay đổi." - unknown_property: "không phải là thuộc tính được biết đến." + unknown_property: "không phải là một tài sản được biết đến." unknown_property_nested: "có đường dẫn không xác định '%{path}'." unremovable: "không thể gỡ bỏ." url_not_secure_context: > - không cung cấp "Bối cảnh Bảo mật". Vui lòng sử dụng HTTPS hoặc địa chỉ vòng lặp, chẳng hạn như localhost. + không cung cấp "Bối cảnh an toàn". Sử dụng HTTPS hoặc địa chỉ loopback, chẳng hạn như localhost. wrong_length: "độ dài không đúng (phải là %{count} ký tự)." models: ldap_auth_source: attributes: tls_certificate_string: - invalid_certificate: "Chứng chỉ SSL cung cấp không hợp lệ: %{additional_message}" + invalid_certificate: "Chứng chỉ SSL được cung cấp không hợp lệ: %{additional_message}" format: "%{message}" attachment: attributes: content_type: - blank: "Loại nội dung của tệp không thể để trống." - not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload." + blank: "Loại nội dung của tập tin không được để trống." + not_allowlisted: "Tệp đã bị bộ lọc tự động từ chối. '%{value}' không được phép tải lên." format: "%{message}" capability: context: - global: "Toàn cầu" + global: "toàn cầu" query: filters: - minimum: "cần bao gồm ít nhất một bộ lọc cho principal, context hoặc id với toán tử '='." + minimum: "cần bao gồm ít nhất một bộ lọc cho giá trị chính, ngữ cảnh hoặc id bằng toán tử '='." custom_field: at_least_one_custom_option: "Ít nhất một lựa chọn cần phải được cung cấp." - previous_custom_field_recalculation_unprocessed: "The recalculation of previous changes for this custom field have not been applied yet, please try again in a few minutes." + previous_custom_field_recalculation_unprocessed: "Tính toán lại các thay đổi trước đó cho trường tùy chỉnh này chưa được áp dụng, vui lòng thử lại sau vài phút." referenced_in_other_fields_html: - other: "%{name} is used in project attribute calculations: %{links}." + other: "%{name} được sử dụng trong tính toán thuộc tính dự án: %{links}." attributes: formula: - blank: "Formula can't be blank." - invalid: "Formula is invalid." - invalid_characters: "Only numeric values, mathematical operators and project attributes of type integer, float, calculated value and weighted list are allowed." - not_allowed_custom_fields_referenced: "The attribute %{custom_fields} cannot be used because it leads to a circular reference; one attribute depends on the other." + blank: "Công thức không được để trống." + invalid: "Công thức không hợp lệ." + invalid_characters: "Chỉ cho phép các giá trị số, toán tử toán học và thuộc tính dự án thuộc loại số nguyên, số float, giá trị được tính toán và danh sách có trọng số." + not_allowed_custom_fields_referenced: "Thuộc tính %{custom_fields} không thể được sử dụng vì nó dẫn đến tham chiếu vòng tròn; một thuộc tính phụ thuộc vào thuộc tính khác." format: "%{message}" required: - cannot_be_true: "cannot be set to true." + cannot_be_true: "không thể được đặt thành đúng." custom_fields_project: attributes: project_ids: @@ -1576,20 +1607,20 @@ vi: fragment_present: "không thể chứa một đoạn." invalid_uri: "phải là một URI hợp lệ." relative_uri: "phải là một URI tuyệt đối." - secured_uri: 'không cung cấp "Bối cảnh Bảo mật". Vui lòng sử dụng HTTPS hoặc địa chỉ vòng lặp, chẳng hạn như localhost.' + secured_uri: 'không cung cấp "Bối cảnh an toàn". Sử dụng HTTPS hoặc địa chỉ loopback, chẳng hạn như localhost.' forbidden_uri: "bị chặn bởi máy chủ." scopes: not_match_configured: "không phù hợp bất cứ phạm vi nào." enterprise_trial: - already_used: "was already used to create a trial." - failed_to_create: "Trial could not be created (%{status})" - general_consent: "Please accept the terms and conditions." + already_used: "đã được sử dụng để tạo bản dùng thử." + failed_to_create: "Không thể tạo bản dùng thử (%{status})" + general_consent: "Vui lòng chấp nhận các điều khoản và điều kiện." enterprise_token: - only_one_trial: "Only one trial token can be active. Please delete the previous trial token before adding another." + only_one_trial: "Chỉ có một mã thông báo dùng thử có thể hoạt động. Vui lòng xóa mã thông báo dùng thử trước đó trước khi thêm mã thông báo khác." unreadable: "không thể đọc được. Bạn có chắc đó là mã thông báo hỗ trợ không?" - already_added: "This token has already been added." + already_added: "Mã thông báo này đã được thêm vào." favorite: - already_favorited: "has already been favorited." + already_favorited: "đã được yêu thích rồi." grids/grid: overlaps: "chồng lấn." outside: "nằm ngoài bảng dữ liệu." @@ -1598,24 +1629,24 @@ vi: attributes: name: blank: "là bắt buộc. Vui lòng chọn một tên." - not_unique: "đã được sử dụng. Vui lòng chọn một tên khác." + not_unique: "đã được sử dụng. Vui lòng chọn tên khác." meeting: - error_conflict: "Unable to save because the meeting was updated by someone else in the meantime. Please reload the page." + error_conflict: "Không thể lưu vì cuộc họp đã được người khác cập nhật trong thời gian chờ đợi. Vui lòng tải lại trang." notifications: - at_least_one_channel: "Cần chỉ định ít nhất một kênh để gửi thông báo." + at_least_one_channel: "Cần phải chỉ định ít nhất một kênh để gửi thông báo." attributes: read_ian: - read_on_creation: "không thể được thiết lập thành true khi tạo thông báo." + read_on_creation: "không thể đặt thành true khi tạo thông báo." mail_reminder_sent: - set_on_creation: "không thể được thiết lập thành true khi tạo thông báo." + set_on_creation: "không thể đặt thành true khi tạo thông báo." reason: - no_notification_reason: "không thể để trống khi IAN được chọn làm kênh." + no_notification_reason: "không thể để trống vì IAN được chọn làm kênh." reason_mail_digest: - no_notification_reason: "không thể để trống khi mail digest được chọn làm kênh." + no_notification_reason: "không được để trống vì thông báo thư được chọn làm kênh." non_working_day: attributes: date: - taken: "Một ngày không làm việc đã tồn tại cho %{value}." + taken: "Đã tồn tại một ngày không làm việc cho %{value}." format: "%{message}" parse_schema_filter_params_service: attributes: @@ -1626,15 +1657,15 @@ vi: project: archived_ancestor: "Dự án có một khu vực lưu trữ" foreign_wps_reference_version: "Các gói công việc trong các phiên bản tham chiếu không kế thừa của dự án hoặc kế thừa nó." - cannot_be_assigned_to_artifact_work_package: "The chosen user is not allowed to be assigned to work packages." + cannot_be_assigned_to_artifact_work_package: "Người dùng đã chọn không được phép gán cho các gói công việc." attributes: base: archive_permission_missing_on_subprojects: "Bạn không có quyền cần thiết để lưu trữ tất cả các dự án con. Vui lòng liên hệ với quản trị viên." - project_initiation_request_disabled: "Project initiation request is disabled. It must be enabled to create the artifact work package." + project_initiation_request_disabled: "Yêu cầu khởi tạo dự án bị vô hiệu hóa. Nó phải được kích hoạt để tạo gói công việc tạo tác." types: in_use_by_work_packages: "gói công việc vẫn được sử dụng: %{types}" enabled_modules: - dependency_missing: "Mô-đun '%{dependency}' cũng cần được bật vì mô-đun '%{module}' phụ thuộc vào nó." + dependency_missing: "Mô-đun '%{dependency}' cũng cần được bật vì mô-đun '%{module}' phụ thuộc vào mô-đun đó." format: "%{message}" project_custom_field_project_mapping: attributes: @@ -1643,11 +1674,11 @@ vi: project/phase: attributes: start_date: - must_be_before_finish_date: "must be before the finish date." - non_continuous_dates: "can't be earlier than the previous phase's end date." + must_be_before_finish_date: "phải trước ngày kết thúc." + non_continuous_dates: "không thể sớm hơn ngày kết thúc của giai đoạn trước." finish_date: - must_be_after_start_date: "must be after the start date." - cannot_be_a_non_working_day: "can't be a non-working day." + must_be_after_start_date: "phải sau ngày bắt đầu." + cannot_be_a_non_working_day: "không thể là một ngày không làm việc." query: attributes: public: @@ -1662,45 +1693,45 @@ vi: invalid: "Không thể sắp xếp theo cột: %{value}" format: "%{message}" timestamps: - invalid: "Dấu thời gian chứa các giá trị không hợp lệ: %{values}" - forbidden: "Các dấu thời gian chứa các giá trị bị cấm: %{values}" + invalid: "Dấu thời gian chứa giá trị không hợp lệ: %{values}" + forbidden: "Dấu thời gian chứa các giá trị bị cấm: %{values}" format: "%{message}" selects: - name_not_included: "Cột 'Tên' cần phải được bao gồm" + name_not_included: "Cột 'Tên' cần được đưa vào" nonexistent: "Cột '%{column}' không tồn tại." format: "%{message}" - group_by_hierarchies_exclusive: "xung đột với nhóm theo '%{group_by}'. Bạn không thể kích hoạt cả hai." - can_only_be_modified_by_owner: "Truy vấn chỉ có thể được chỉnh sửa bởi chủ sở hữu của nó." - need_permission_to_modify_public_query: "Bạn không thể chỉnh sửa một truy vấn công khai." + group_by_hierarchies_exclusive: "loại trừ lẫn nhau với nhóm bởi '%{group_by}'. Bạn không thể kích hoạt cả hai." + can_only_be_modified_by_owner: "Truy vấn chỉ có thể được sửa đổi bởi chủ sở hữu của nó." + need_permission_to_modify_public_query: "Bạn không thể sửa đổi truy vấn công khai." filters: custom_fields: inexistent: "Không có trường tùy chỉnh cho bộ lọc." queries/filters/base: attributes: values: - inclusion: "bộ lọc có các giá trị không hợp lệ." + inclusion: "bộ lọc có giá trị không hợp lệ." format: "%{message}" queries/principals/filters/internal_mentionable_on_work_package_filter: attributes: values: - single_value_requirement: "must be a single work package" + single_value_requirement: "phải là một gói công việc duy nhất" relation: typed_dag: circular_dependency: "Mối quan hệ tạo ra một vòng tròn các mối quan hệ." attributes: base: - error_not_deletable: "This relation cannot be deleted because you do not have edit permissions for the selected work package." - error_not_editable: "This relation cannot be edited because you do not have edit permissions for the selected work package." + error_not_deletable: "Không thể xóa mối quan hệ này vì bạn không có quyền chỉnh sửa đối với gói công việc đã chọn." + error_not_editable: "Không thể chỉnh sửa mối quan hệ này vì bạn không có quyền chỉnh sửa đối với gói công việc đã chọn." to_id: - format: "The selected work package %{message}" - error_not_found: "could not be found." - error_readonly: "cannot be changed for existing relations." - error_not_manageable: "cannot be added because you do not have edit permissions for the selected work package." + format: "Gói công việc đã chọn %{message}" + error_not_found: "không thể tìm thấy." + error_readonly: "không thể thay đổi các mối quan hệ hiện có." + error_not_manageable: "không thể thêm vì bạn không có quyền chỉnh sửa đối với gói công việc đã chọn." from_id: - format: "The selected work package %{message}" - error_not_found: "could not be found." - error_readonly: "cannot be changed for existing relations." - error_not_manageable: "cannot be added because you do not have edit permissions for the selected work package." + format: "Gói công việc đã chọn %{message}" + error_not_found: "không thể tìm thấy." + error_readonly: "không thể thay đổi các mối quan hệ hiện có." + error_not_manageable: "không thể thêm vì bạn không có quyền chỉnh sửa đối với gói công việc đã chọn." repository: not_available: "Nhà cung cấp SCM không có sẵn" not_whitelisted: "không được cấu hình cho phép." @@ -1710,20 +1741,20 @@ vi: role: attributes: permissions: - dependency_missing: "cần bao gồm '%{dependency}' vì '%{permission}' được chọn." + dependency_missing: "cũng cần bao gồm '%{dependency}' vì '%{permission}' được chọn." setting: attributes: base: - working_days_are_missing: "Ít nhất một ngày trong tuần phải được định nghĩa là ngày làm việc." - previous_working_day_changes_unprocessed: "Các thay đổi trước đó về cấu hình ngày làm việc chưa được áp dụng." - hours_per_day_are_missing: "Số giờ mỗi ngày phải được định nghĩa." - durations_are_not_positive_numbers: "Thời gian phải là các số dương." - hours_per_day_is_out_of_bounds: "Số giờ mỗi ngày không thể vượt quá 24" + working_days_are_missing: "Ít nhất một ngày trong tuần phải được xác định là ngày làm việc." + previous_working_day_changes_unprocessed: "Những thay đổi trước đó đối với cấu hình ngày làm việc vẫn chưa được áp dụng." + hours_per_day_are_missing: "Số giờ mỗi ngày phải được xác định." + durations_are_not_positive_numbers: "Khoảng thời gian phải là số dương." + hours_per_day_is_out_of_bounds: "Số giờ mỗi ngày không thể nhiều hơn 24" status: attributes: default_done_ratio: inclusion: "phải nằm trong khoảng từ 0 đến 100." - readonly_default_exlusive: "không thể được kích hoạt cho các trạng thái được đánh dấu là mặc định." + readonly_default_exlusive: "không thể kích hoạt cho các trạng thái được đánh dấu mặc định." time_entry: attributes: hours: @@ -1731,21 +1762,21 @@ vi: user_preference: attributes: pause_reminders: - invalid_range: "chỉ có thể là một khoảng thời gian hợp lệ." + invalid_range: "chỉ có thể là một phạm vi ngày hợp lệ." daily_reminders: - full_hour: "chỉ có thể được cấu hình để được gửi vào giờ tròn." + full_hour: "chỉ có thể được cấu hình để gửi vào một giờ đầy đủ." notification_settings: - only_one_global_setting: "Phải có chỉ một cài đặt thông báo toàn cầu." - email_alerts_global: "Cài đặt thông báo qua email chỉ có thể được thiết lập toàn cầu." + only_one_global_setting: "Chỉ được có một cài đặt thông báo chung." + email_alerts_global: "Cài đặt thông báo qua email chỉ có thể được đặt trên toàn cầu." format: "%{message}" wrong_date: "Giá trị sai cho Ngày bắt đầu, Ngày đến hạn hoặc Quá hạn." watcher: attributes: user_id: not_allowed_to_view: "không được phép xem tài nguyên này." - locked: "bị khóa." + locked: "đã bị khóa." wiki_page: - error_conflict: "Trang wiki đã được cập nhật bởi người khác trong khi bạn đang chỉnh sửa." + error_conflict: "Trang wiki đã được người khác cập nhật trong khi bạn đang chỉnh sửa nó." attributes: slug: undeducible: "không thể suy ra từ tiêu đề '%{title}'." @@ -1754,35 +1785,35 @@ vi: attributes: id: format: "%{message}" - cannot_add_child_because_of_lack_of_permission: "Cannot add child because you don't have permissions to edit the selected work package." - blank: "ID can't be blank." + cannot_add_child_because_of_lack_of_permission: "Không thể thêm con vì bạn không có quyền chỉnh sửa gói công việc đã chọn." + blank: "ID không được để trống." assigned_to: format: "%{message}" done_ratio: does_not_match_work_and_remaining_work: "không khớp với Công việc và Công việc còn lại" - cannot_be_set_when_work_is_zero: "không thể thiết lập khi Công việc là 0h" - must_be_set_when_remaining_work_is_set: "cần thiết khi công việc còn lại được thiết lập." - must_be_set_when_work_and_remaining_work_are_set: "cần thiết khi Công việc và Công việc còn lại được thiết lập." + cannot_be_set_when_work_is_zero: "không thể đặt khi Công việc là 0h" + must_be_set_when_remaining_work_is_set: "được yêu cầu khi Công việc còn lại được đặt." + must_be_set_when_work_and_remaining_work_are_set: "được yêu cầu khi Công việc và Công việc còn lại được đặt." inclusion: "phải nằm trong khoảng từ 0 đến 100." due_date: not_start_date: "không phải ngày bắt đầu, mặc dù điều này là cần thiết cho các mốc quan trọng." - cannot_be_null: "không thể được đặt thành null vì ngày bắt đầu và thời gian là đã biết." + cannot_be_null: "không thể được đặt thành null vì ngày bắt đầu và thời lượng đã biết." duration: - larger_than_dates: "lớn hơn khoảng thời gian giữa ngày bắt đầu và ngày kết thúc." - smaller_than_dates: "nhỏ hơn khoảng thời gian giữa ngày bắt đầu và ngày kết thúc." - not_available_for_milestones: "không khả dụng cho các gói công việc kiểu cột mốc." - cannot_be_null: "không thể được đặt thành null vì ngày bắt đầu và ngày kết thúc đã được biết." - not_an_integer: "không phải là thời gian hợp lệ." + larger_than_dates: "lớn hơn khoảng cách giữa ngày bắt đầu và ngày kết thúc." + smaller_than_dates: "nhỏ hơn khoảng cách giữa ngày bắt đầu và ngày kết thúc." + not_available_for_milestones: "không có sẵn cho các gói công việc được đánh dấu theo mốc quan trọng." + cannot_be_null: "không thể được đặt thành null vì ngày bắt đầu và ngày kết thúc đã biết." + not_an_integer: "không phải là một khoảng thời gian hợp lệ." parent: cannot_be_milestone: "không thể là một cột mốc." - cannot_be_self_assigned: "không thể tự phân bổ cho chính nó." + cannot_be_self_assigned: "không thể gán cho chính nó." cannot_be_in_another_project: "không thể có trong một dự án khác." not_a_valid_parent: "không hợp lệ" schedule_manually: - cannot_be_automatically_scheduled: "cannot be set to false (automatically scheduled) as it has no predecessors or children." + cannot_be_automatically_scheduled: "không thể được đặt thành sai (được lên lịch tự động) vì nó không có tiền thân hoặc con." start_date: violates_relationships: "chỉ có thể được thiếp lập sang %{soonest_start} hoặc mới hơn để không làm vi phạm các mối quan hệ của work package." - cannot_be_null: "không thể được đặt thành null vì ngày kết thúc và thời gian đã được biết." + cannot_be_null: "không thể được đặt thành null vì ngày kết thúc và thời lượng đã biết." status_id: status_transition_invalid: "không hợp lệ vì không tồn tại chuyển đổi hợp lệ từ trạng thái cũ sang trạng thái mới cho vai trò của người dùng hiện tại." status_invalid_in_type: "không hợp lệ vì tình trạng hiện tại không tồn tại loại này." @@ -1794,44 +1825,44 @@ vi: only_same_project_categories_allowed: "Các thể loại của một work package phải trong dự án tương tự như work package." does_not_exist: "Thể loại đã chỉ định không tồn tại." estimated_hours: - not_a_number: "không phải là thời gian hợp lệ." - cant_be_inferior_to_remaining_work: "không thể thấp hơn Công việc còn lại." - must_be_set_when_remaining_work_and_percent_complete_are_set: "bắt buộc khi thiết lập Công việc còn lại và % Hoàn thành." + not_a_number: "không phải là một khoảng thời gian hợp lệ." + cant_be_inferior_to_remaining_work: "không thể thấp hơn công việc còn lại." + must_be_set_when_remaining_work_and_percent_complete_are_set: "được yêu cầu khi đặt Công việc còn lại và % Hoàn thành." remaining_hours: - not_a_number: "không phải là thời gian hợp lệ." + not_a_number: "không phải là một khoảng thời gian hợp lệ." cant_exceed_work: "không thể cao hơn Công việc." - must_be_set_when_work_is_set: "cần thiết khi Công việc được thiết lập." - must_be_set_when_work_and_percent_complete_are_set: "bắt buộc khi Công việc và % Hoàn thành được thiết lập." - must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- must be 0h when Work is set and % Complete is 100%.' + must_be_set_when_work_is_set: "được yêu cầu khi Công việc được đặt." + must_be_set_when_work_and_percent_complete_are_set: "được yêu cầu khi Công việc và % Hoàn thành được đặt." + must_be_set_to_zero_hours_when_work_is_set_and_percent_complete_is_100p: '>- phải là 0h khi Công việc được đặt và % Hoàn thành là 100%.' must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- phải trống khi Công việc trống và % Hoàn thành là 100%. - readonly_status: "Gói công việc đang ở trạng thái chỉ đọc nên các thuộc tính của nó không thể bị thay đổi." + readonly_status: "Gói công việc ở trạng thái chỉ đọc nên các thuộc tính của nó không thể thay đổi." type: attributes: attribute_groups: attribute_unknown: "Thuộc tính gói công việc không hợp lệ được sử dụng." - attribute_unknown_name: "Thuộc tính gói công việc không hợp lệ được sử dụng: %{attribute}" + attribute_unknown_name: "Thuộc tính gói công việc được sử dụng không hợp lệ: %{attribute}" duplicate_group: "Nhóm tên '%{group}' được sử dụng nhiều hơn một lần. Tên nhóm phải là duy nhất." query_invalid: "Truy vấn nhúng '%{group}' là không hợp lệ: %{details}" - group_without_name: "Các nhóm không tên không được phép." + group_without_name: "Nhóm không có tên không được phép." patterns: - invalid_tokens: "One or more attributes inside the field are not valid. Please, fix the attributes before saving." + invalid_tokens: "Một hoặc nhiều thuộc tính bên trong trường này không hợp lệ. Vui lòng sửa các thuộc tính trước khi lưu." user: attributes: base: - user_limit_reached: "Đã đạt giới hạn người dùng. Không thể tạo thêm tài khoản trên kế hoạch hiện tại." - one_must_be_active: "Người dùng Quản trị không thể bị khóa/xóa. Ít nhất một quản trị viên phải hoạt động." + user_limit_reached: "Đã đạt đến giới hạn người dùng. Không thể tạo thêm tài khoản trên gói hiện tại." + one_must_be_active: "Người dùng quản trị không thể bị khóa/xóa. Ít nhất một quản trị viên phải hoạt động." password_confirmation: confirmation: "Xác nhận mật khẩu không khớp với mật khẩu." format: "%{message}" password: - weak: "Phải chứa các ký tự của các lớp sau (tối thiểu là %{min_count} %{all_count}): %{rules}" + weak: "Phải chứa các ký tự thuộc các lớp sau (ít nhất %{min_count} trong số %{all_count}): %{rules}" lowercase: "chữ thường (ví dụ như 'a')" uppercase: "chữ hoa (ví dụ như ' A')" numeric: "số (ví dụ như ' 1')" special: "đặc biệt (ví dụ như ' %')" reused: - other: "đã được sử dụng trước đây. Vui lòng chọn cái khác mà phải khác với %{count} cuối cùng của bạn." + other: "đã được sử dụng trước đây. Vui lòng chọn một cái khác với %{count} cuối cùng của bạn." match: confirm: "Xác nhận lại mật khẩu." description: "'Xác nhận mật khẩu ' phải trùng với dữ liệu trong mục 'Mật khẩu mới'." @@ -1845,59 +1876,62 @@ vi: ungrantable: "có một vai trò không thể chuyển nhượng." more_than_one: "có nhiều hơn một vai trò." principal: - unassignable: "không thể phân bổ cho một dự án." + unassignable: "không thể được chỉ định cho một dự án." version: - undeletable_archived_projects: "Phiên bản không thể bị xóa vì nó có các gói công việc gắn liền với nó." - undeletable_work_packages_attached: "Phiên bản không thể bị xóa vì nó có các gói công việc gắn liền với nó." + undeletable_archived_projects: "Không thể xóa phiên bản này vì nó có các gói công việc được đính kèm." + undeletable_work_packages_attached: "Không thể xóa phiên bản này vì nó có các gói công việc được đính kèm." token/named: attributes: token_name: - blank: "Please provide a token name" - in_use: "This token name is already in use, please select a different one" + blank: "Vui lòng cung cấp tên mã thông báo" + in_use: "Tên mã thông báo này đã được sử dụng, vui lòng chọn tên khác" format: "%{message}" template: body: "Vui lòng kiểm tra các mục sau đây:" header: - other: "%{count} lỗi ngăn không cho lưu %{model} này" + other: "%{count} lỗi đã cấm lưu %{model} này" models: - attachment: "Tệp" + attachment: "tập tin" attribute_help_text: - other: "Attribute help texts" + other: "Văn bản trợ giúp thuộc tính" auth_provider: - other: "Authentication providers" + other: "Nhà cung cấp xác thực" category: "Thể loại" - color: "Màu sắc" + color: "màu sắc" comment: "Nhận xét" custom_action: "Tác vụ tùy chỉnh" custom_field: "Tùy chỉnh mục" "doorkeeper/application": "Ứng dụng OAuth" enterprise_token: - other: "Enterprise tokens" - forum: "Diễn đàn" + other: "Mã thông báo doanh nghiệp" + forum: "diễn đàn" global_role: "Vai trò toàn cầu" group: "Nhóm" issue_priority: - other: "Priorities" - meeting_participant: "Meeting participant" + other: "ưu tiên" + meeting_participant: "Người tham gia cuộc họp" member: "Thành viên" news: "Tin tức" notification: - other: "Thông báo" - placeholder_user: "Người dùng tạm thời" + other: "thông báo" + placeholder_user: "Người dùng giữ chỗ" project: - other: "Các dự án" + other: "dự án" project_query: other: "Danh sách dự án" query: "Truy vấn riêng" - reminder: "Reminder" + reminder: "Lời nhắc" role: - other: "Vai trò" + other: "Vai trò" scim_client: - other: "SCIM clients" + other: "khách hàng SCIM" status: "Tình trạng work package" token/api: - other: Mã truy cập - type: "Kiểu" + other: Mã thông báo truy cập + token/rss: + other: "Mã thông báo RSS" + type: + other: "các loại" user: "Người dùng" version: "Phiên bản" workflow: "Quy trình làm việc" @@ -1906,162 +1940,162 @@ vi: wiki_page: "Trang wiki" errors: header_invalid_fields: - other: "Đã có vấn đề với các mục sau đây:" + other: "Đã xảy ra sự cố với các trường sau:" header_additional_invalid_fields: - other: "Ngoài ra, còn có vấn đề với trường sau:" - field_erroneous_label: "Trường này không hợp lệ: %{full_errors}\nVui lòng nhập giá trị hợp lệ." + other: "Ngoài ra, còn có vấn đề với các trường sau:" + field_erroneous_label: "Trường này không hợp lệ: %{full_errors}\nVui lòng nhập một giá trị hợp lệ." messages: - must_be_template: "must be template" - unsupported_storage_type: "is not a supported storage type." - storage_error: "There was an error with the storage connection." - invalid_input: "The input is invalid." + must_be_template: "phải là mẫu" + unsupported_storage_type: "không phải là loại lưu trữ được hỗ trợ." + storage_error: "Đã xảy ra lỗi với kết nối lưu trữ." + invalid_input: "Đầu vào không hợp lệ." activity: item: created_by_on: "được tạo bởi %{user} vào %{datetime}" - created_by_on_time_entry: "thời gian ghi bởi %{user} vào %{datetime}" + created_by_on_time_entry: "thời gian được %{user} ghi lại vào %{datetime}" created_on: "được tạo vào %{datetime}" - created_on_time_entry: "thời gian ghi vào %{datetime}" + created_on_time_entry: "thời gian đăng nhập %{datetime}" updated_by_on: "được cập nhật bởi %{user} vào %{datetime}" - updated_by_on_time_entry: "thời gian ghi được cập nhật bởi %{user} vào %{datetime}" - updated_on: "được cập nhật vào %{datetime}" - updated_on_time_entry: "thời gian ghi được cập nhật vào %{datetime}" - deleted_on: "được xóa vào %{datetime}" - deleted_by_on: "được xóa bởi %{user} vào %{datetime}" - added_on: "được thêm vào %{datetime}" + updated_by_on_time_entry: "thời gian đã ghi được cập nhật bởi %{user} vào %{datetime}" + updated_on: "đã cập nhật vào %{datetime}" + updated_on_time_entry: "thời gian đã đăng nhập được cập nhật vào %{datetime}" + deleted_on: "đã xóa trên %{datetime}" + deleted_by_on: "đã bị xóa bởi %{user} vào %{datetime}" + added_on: "đã thêm vào %{datetime}" added_by_on: "được thêm bởi %{user} vào %{datetime}" - removed_on: "được gỡ bỏ vào %{datetime}" - removed_by_on: "được gỡ bỏ bởi %{user} vào %{datetime}" - parent_without_of: "Dự án con" - parent_no_longer: "Không còn là dự án con của" + removed_on: "đã xóa vào %{datetime}" + removed_by_on: "bị xóa bởi %{user} trên %{datetime}" + parent_without_of: "dự án con" + parent_no_longer: "Không còn tiểu dự án của" time_entry: hour: other: "%{count} giờ" hour_html: other: "%{count} giờ" - updated: "thay đổi từ %{old_value} thành %{value}" - logged_for: "Ghi lại cho" + updated: "đã thay đổi từ %{old_value} thành %{value}" + logged_for: "Đã đăng nhập" filter: - changeset: "Nhóm thay đổi" - message: "Diễn đàn" - news: "Tin tức" + changeset: "Bộ thay đổi" + message: "diễn đàn" + news: "tin tức" project_details: "Chi tiết dự án" - subproject: "Bao gồm dự án con" - time_entry: "Thời gian" - wiki_edit: "Wiki" + subproject: "Bao gồm các tiểu dự án" + time_entry: "dành thời gian" + wiki_edit: "wiki" work_package: "Work Packages" project_phase: - activated: "đã kích hoạt" - added_date: "set to %{date}" - changed_date: "changed from %{from} to %{to}" - deactivated: "đã tắt" - deleted_project_phase: "Deleted project phase" - phase_and_both_gates: "%{phase_message}. %{start_gate_message}, and %{finish_gate_message}" + activated: "kích hoạt" + added_date: "đặt thành %{date}" + changed_date: "đã thay đổi từ %{from} thành %{to}" + deactivated: "bị vô hiệu hóa" + deleted_project_phase: "Giai đoạn dự án đã xóa" + phase_and_both_gates: "%{phase_message}. %{start_gate_message} và %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: "date deleted %{date}" + removed_date: "ngày xóa %{date}" #common attributes of all models attributes: active: "Đang hoạt động" assigned_to: "Người được giao" - assignee: "Người được giao" + assignee: "Người được chuyển nhượng" attachments: "Đính kèm" - actor: "Actor" - action: "Hành động" + actor: "tác nhân" + action: "hành động" api_key: "Khóa API" author: "Tác giả" - avatar: "Ảnh đại diện" + avatar: "hình đại diện" base: "Lỗi tổng quan:" - body: "Body" + body: "cơ thể" blocks_ids: "ID của các work package bị chặn" - category: "Thể loại" - comment: "Nhận xét" - comments: "Nhận xét" + category: "thể loại" + comment: "bình luận" + comments: "bình luận" content: "Nội dung" - color: "Màu sắc" - creator: "Người tạo" + color: "màu sắc" + creator: "Người sáng tạo" created_at: "Tạo ngày" - custom_field: "Tùy chỉnh mục" + custom_field: "Trường tùy chỉnh" custom_options: "Giá trị có thể" custom_values: "Tùy chỉnh mục" - date: "Ngày" - dates_interval: "Khoảng thời gian" + date: "ngày" + dates_interval: "Phạm vi ngày" default_columns: "Cột mặc định" description: "Mô tả" - derived_due_date: "Ngày kết thúc suy ra" - derived_estimated_hours: "Tổng thời gian làm việc" - derived_start_date: "Ngày bắt đầu suy ra" - direction: "Direction" + derived_due_date: "Ngày kết thúc phái sinh" + derived_estimated_hours: "Tổng công việc" + derived_start_date: "Ngày bắt đầu có nguồn gốc" + direction: "Hướng" display_sums: "Hiển thị tổng" - domain: "Miền" + domain: "miền" due_date: "Ngày kết thúc" - estimated_hours: "Công việc" - estimated_time: "Công việc" - email: "Thư điện tử" - entity_type: "Entity" - expires_at: "Expires on" + estimated_hours: "làm việc" + estimated_time: "làm việc" + email: "email" + entity_type: "thực thể" + expires_at: "Hết hạn vào" firstname: "Tên" - filter: "Bộ lọc" - group: "Nhóm" - groups: "Các Nhóm" - hexcode: "Mã Hex" + filter: "bộ lọc" + group: "nhóm" + groups: "nhóm" + hexcode: "Mã hex" id: "ID" is_default: "Giá trị mặc định" is_for_all: "Cho tất cả các dự án" - public: "Công cộng" - principal: "User or group" + public: "công khai" + principal: "Người dùng hoặc nhóm" #kept for backwards compatibility issue: "Work Package" - journal: "Nhật ký" - journal_notes: "Nhận xét" + journal: "nhật ký" + journal_notes: "bình luận" lastname: "Họ" login: "Tên người dùng" - lock_version: "Khóa phiên bản" + lock_version: "Phiên bản khóa" mail: "Thư điện tử" name: "Tên" - note: "Ghi chú" + note: "Lưu ý" notes: "Ghi chú" - number: "Number" - options: "Tuỳ chọn" + number: "con số" + options: "tùy chọn" operator: "Toán tử" password: "Mật khẩu" - priority: "Độ ưu tiên" - project: "Dự án" - project_ids: "Project IDs" - project_phase: "Project phase" - project_phase_definition: "Project phase" - reason: "Lý do" + priority: "ưu tiên" + project: "dự án" + project_ids: "ID dự án" + project_phase: "Giai đoạn dự án" + project_phase_definition: "Giai đoạn dự án" + reason: "lý do" responsible: "Trách nhiệm" - required: "Bắt buộc" - recipient: "Recipient" + required: "bắt buộc" + recipient: "Người nhận" role: "Vai trò" roles: "Vai trò" - search: "Tìm kiếm" + search: "tìm kiếm" start_date: "Ngày bắt đầu" status: "Trạng thái" - state: "State" + state: "tiểu bang" subject: "Chủ đề" - slug: "Slug" + slug: "sên" summary: "Tóm tắt" - template: "Template" + template: "mẫu" time_zone: "Múi giờ" - text: "Văn bản" + text: "văn bản" title: "Tiêu đề" - type: "Kiểu" - typeahead: "Autocomplete" - uid: "Unique identifier" + type: "loại" + typeahead: "tự động hoàn thành" + uid: "Mã định danh duy nhất" updated_at: "Được cập nhật vào lúc" - updated_on: "Được cập nhật vào lúc" + updated_on: "Đã cập nhật vào" uploader: "Tải lên" - user: "Người dùng" - username: "Tên người dùng" + user: "người dùng" + username: "tên người dùng" unit: "Đơn vị" - value: "Giá trị" - values: "Values" + value: "giá trị" + values: "giá trị" version: "Phiên bản" - visible: "Hiển thị" + visible: "có thể nhìn thấy" work_package: "Work Package" - work_package_id: "Work Package" + work_package_id: "Gói công việc" backup: - failed: "Sao lưu thất bại" + failed: "Sao lưu không thành công" label_backup_token: "Sao lưu token" label_create_token: "Tạo bản sao lưu token" label_delete_token: "Xóa bản sao lưu token" @@ -2070,8 +2104,8 @@ vi: reset_token: action_create: Tạo mới action_reset: Reset - heading_reset: "Tạo lại bản sao lưu token" - heading_create: "Tạo bản sao lưu token" + heading_reset: "Đặt lại mã thông báo dự phòng" + heading_create: "Tạo mã thông báo dự phòng" implications: > Kích hoạt sao lưu sẽ cho phép bất kỳ người dùng nào có quyền và token sao lưu đều có thể tải xuống bản sao lưu có chứa tất cả dữ liệu của trang này. Nó cũng bao gồm dữ liệu của tất cả người dùng khác. info: > @@ -2088,12 +2122,12 @@ vi: token_cooldown: Mã token sao lưu sẽ có giá trị trong %{hours} giờ. backup_pending: Có một bản sao lưu đang chờ xử lý. limit_reached: Bạn chỉ có thể tạo %{limit} bản sao lưu mỗi ngày. - button_actions: "Hành động" + button_actions: "hành động" button_add: "Thêm" - button_add_comment: "Thêm bình luận" - button_add_item_above: "Add item above" - button_add_item_below: "Add item below" - button_add_sub_item: "Add sub-item" + button_add_comment: "Thêm nhận xét" + button_add_item_above: "Thêm mục ở trên" + button_add_item_below: "Thêm mục bên dưới" + button_add_sub_item: "Thêm mục phụ" button_add_member: Thêm thành viên button_add_watcher: "Thêm người theo dõi" button_annotate: "Chú giải" @@ -2110,29 +2144,30 @@ vi: button_click_to_reveal: "Chọn để xem" button_close: "Đóng" button_collapse_all: "Thu gọn tất cả" + button_confirm: "Xác nhận" button_configure: "Thiết lập" button_continue: "Tiếp tục" - button_complete: "Complete" + button_complete: "Hoàn thành" button_copy: "Sao chép" - button_copy_to_clipboard: "Sao chép vào clipboard" + button_copy_to_clipboard: "Sao chép vào khay nhớ tạm" button_copy_link_to_clipboard: "Sao chép liên kết vào clipboard" button_create: "Tạo mới" button_create_and_continue: "Tạo và tiếp tục" button_decline: "Từ chối" button_delete: "Xoá" - button_delete_permanently: "Delete permanently" + button_delete_permanently: "Xóa vĩnh viễn" button_delete_watcher: "Xóa watcher %{name}" button_download: "Tải" - button_disable: "Disable" + button_disable: "vô hiệu hóa" button_duplicate: "Nhân đôi" - button_duplicate_and_follow: "Duplicate and follow" + button_duplicate_and_follow: "Nhân bản và làm theo" button_edit: "Chỉnh sửa" - button_enable: "Enable" - button_edit_associated_wikipage: "Edit associated wiki page: %{page_title}" + button_enable: "Kích hoạt" + button_edit_associated_wikipage: "Chỉnh sửa trang wiki liên quan: %{page_title}" button_expand_all: "Mở rộng tất cả" - button_favorite: "Thêm vào yêu thích" - button_filter: "Bộ lọc" - button_finish_setup: "Finish setup" + button_favorite: "Thêm vào mục yêu thích" + button_filter: "bộ lọc" + button_finish_setup: "Hoàn tất thiết lập" button_generate: "Tạo" button_list: "Danh sách" button_lock: "Khóa" @@ -2142,7 +2177,8 @@ vi: button_print: "In" button_quote: "Trích dẫn" button_remove: Xoá - button_remove_reminder: "Remove reminder" + button_remove_permanently: "Xóa vĩnh viễn" + button_remove_reminder: "Xóa lời nhắc" button_rename: "Đổi tên" button_replace: "Thay thế" button_revoke: "Thu hồi" @@ -2152,8 +2188,8 @@ vi: button_save: "Lưu" button_save_as: "Lưu dưới dạng" button_save_back: "Lưu và trở lại" - button_select: "Select" - button_set_reminder: "Set reminder" + button_select: "chọn" + button_set_reminder: "Đặt lời nhắc" button_show: "Hiện" button_sort: "Sắp xếp" button_submit: "Gửi" @@ -2161,7 +2197,7 @@ vi: button_unarchive: "Ngừng lưu trữ" button_uncheck_all: "Bỏ chọn tất cả" button_unlock: "Mở khoá" - button_unfavorite: "Gỡ bỏ khỏi yêu thích" + button_unfavorite: "Xóa khỏi mục yêu thích" button_unwatch: "Ngừng theo dõi" button_update: "Cập Nhật" button_upgrade: "Nâng cấp" @@ -2173,28 +2209,28 @@ vi: button_add_menu_entry: "Thêm mục trình đơn" button_configure_menu_entry: "Cấu hình các mục trình đơn" button_delete_menu_entry: "Xóa mục trình đơn" - button_view_shared_work_packages: "Xem các gói công việc chia sẻ" + button_view_shared_work_packages: "Xem các gói công việc được chia sẻ" button_manage_roles: "Quản lý vai trò" button_remove_member: "Xóa thành viên" - button_remove_member_and_shares: "Xóa thành viên và quyền chia sẻ" + button_remove_member_and_shares: "Xóa thành viên và chia sẻ" button_revoke_work_package_shares: "Thu hồi chia sẻ gói công việc" button_revoke_access: "Thu hồi quyền truy cập" button_revoke_all: "Thu hồi tất cả" button_revoke_only: "Chỉ thu hồi %{shared_role_name}" button_publish: "Công khai" - button_unpublish: "Riêng tư" + button_unpublish: "Đặt ở chế độ riêng tư" consent: checkbox_label: Tôi đã ghi nhận và đồng ý với những điều trên. failure_message: Sự đồng ý không thành công, không thể tiếp tục. title: Sự đồng ý của người dùng decline_warning_message: Bạn đã từ chối đồng ý và đã đăng xuất. - user_has_consented: The user gave their consent to your [configured consent information text](consent_settings). - not_yet_consented: The user has not yet given their consent to your [configured consent information text](consent_settings). They will be reminded the next time they log in. - contact_mail_instructions: Xác định địa chỉ email mà người dùng có thể liên hệ với người quản lý dữ liệu để thực hiện yêu cầu thay đổi hoặc xóa dữ liệu. + user_has_consented: Người dùng đã đồng ý với [configured consent information text](consent_settings) của bạn. + not_yet_consented: Người dùng chưa đồng ý với [configured consent information text](consent_settings) của bạn. Họ sẽ được nhắc nhở vào lần đăng nhập tiếp theo. + contact_mail_instructions: Xác định địa chỉ thư mà người dùng có thể liên hệ với bộ điều khiển dữ liệu để thực hiện các yêu cầu thay đổi hoặc xóa dữ liệu. contact_your_administrator: Vui lòng liên hệ với quản trị viên của bạn nếu bạn muốn xóa tài khoản của mình. - contact_this_mail_address: Vui lòng liên hệ với %{mail_address} nếu bạn muốn xóa tài khoản của mình. - text_update_consent_time: Đánh dấu ô này để buộc người dùng phải đồng ý lại. Kích hoạt khi bạn đã thay đổi khía cạnh pháp lý của thông tin đồng ý trên. - update_consent_last_time: "Cập nhật đồng ý lần cuối: %{update_time}" + contact_this_mail_address: Vui lòng liên hệ %{mail_address} nếu bạn muốn xóa tài khoản của mình. + text_update_consent_time: Chọn hộp này để buộc người dùng đồng ý lại. Bật khi bạn đã thay đổi khía cạnh pháp lý của thông tin chấp thuận ở trên. + update_consent_last_time: "Lần cập nhật cuối cùng về sự đồng ý: %{update_time}" copy_project: title: 'Sao chép dự án "%{source_project_name}"' started: 'Bắt đầu sao chép dự án "%{source_project_name}" sang "%{target_project_name}". Bạn sẽ được thông báo bằng thư ngay sau khi "%{target_project_name}" sẵn sàng.' @@ -2202,7 +2238,7 @@ vi: failed_internal: "Sao chép không thành công do lỗi nội bộ." succeeded: "Lập dự án %{target_project_name}" errors: "Lỗi" - project_custom_fields: "Trường tùy chỉnh trên dự án" + project_custom_fields: "Các trường tùy chỉnh trên dự án" x_objects_of_this_type: zero: "Không có đối tượng thuộc loại này" one: "Một đối tượng của loại này" @@ -2210,31 +2246,31 @@ vi: text: failed: 'Không thể chép dự án "%{source_project_name}" sang dự án "%{target_project_name}".' succeeded: 'Đã sao chép dự án "%{source_project_name}" sang "%{target_project_name}".' - source_project_label: "Project copied" + source_project_label: "Đã sao chép dự án" copy_options: - dependencies_label: "Copy from project" + dependencies_label: "Sao chép từ dự án" create_project: - attributes_heading: "Fill in this mandatory information to work on your projects." + attributes_heading: "Điền thông tin bắt buộc này để thực hiện các dự án của bạn." template_label: "Sử dụng mẫu" - template_heading: "Select a project template to work with the most common project management methods, or create a project from scratch." + template_heading: "Chọn mẫu dự án để làm việc với các phương pháp quản lý dự án phổ biến nhất hoặc tạo dự án từ đầu." copy_options: - dependencies_label: "Copy from template" + dependencies_label: "Sao chép từ mẫu" blank_template: - label: "Blank project" - description: Start from scratch. Manually add project attributes, members and modules. - blank_description: No description provided. + label: "Dự án trống" + description: Bắt đầu lại từ đầu. Thêm thủ công các thuộc tính, thành viên và mô-đun của dự án. + blank_description: Không có mô tả được cung cấp. create_portfolio: - template_heading: "Select a portfolio template to work with the most common project management methods, or create a portfolio from scratch." + template_heading: "Chọn mẫu danh mục đầu tư để làm việc với các phương pháp quản lý dự án phổ biến nhất hoặc tạo danh mục đầu tư từ đầu." blank_template: - label: "Blank portfolio" - description: Start from scratch. Manually add portfolio attributes, members and modules. + label: "Danh mục trống" + description: Bắt đầu lại từ đầu. Thêm thủ công các thuộc tính danh mục đầu tư, thành viên và mô-đun. create_program: - template_heading: "Select a program template to work with the most common project management methods, or create a program from scratch." + template_heading: "Chọn mẫu chương trình để làm việc với các phương pháp quản lý dự án phổ biến nhất hoặc tạo chương trình từ đầu." blank_template: - label: "Blank program" - description: Start from scratch. Manually add program attributes, members and modules. - create_wiki_page: "Create new wiki page" - create_wiki_page_button: "Trang wiki" + label: "Chương trình trống" + description: Bắt đầu lại từ đầu. Thêm thủ công các thuộc tính chương trình, thành viên và mô-đun. + create_wiki_page: "Tạo trang wiki mới" + create_wiki_page_button: "trang Wiki" date: abbr_day_names: - "Chủ nhật" @@ -2258,7 +2294,7 @@ vi: - "Thg 10" - "Thg 11" - "Thg 12" - abbr_week: "Tuần" + abbr_week: "tuần" day_names: - "Chủ Nhật" - "Thứ hai" @@ -2271,24 +2307,24 @@ vi: #Use the strftime parameters for formats. #When no format has been given, it uses default. #You can provide other formats here if you like! - default: "%d-%m-%Y" + default: "%m/%d/%Y" long: "%d %B, %Y" short: "%b %d" #Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: #Used in date_select and datetime_select. - null - - "Tháng Một" - - "Tháng hai" - - "Tháng Ba" - - "Tháng Tư" - - "Thg 5" - - "Tháng sáu" - - "Tháng Bảy" - - "Tháng Tám" - - "Tháng Chín" - - "Tháng mười" - - "Tháng Mười một" - - "Tháng mười hai" + - "tháng Giêng" + - "tháng hai" + - "tháng ba" + - "tháng tư" + - "tháng 5" + - "tháng sáu" + - "tháng bảy" + - "tháng tám" + - "tháng chín" + - "tháng mười" + - "tháng mười một" + - "tháng mười hai" order: - ':năm' - ':tháng' @@ -2307,9 +2343,9 @@ vi: less_than_x_minutes: other: "ít hơn %{count} phút" less_than_x_seconds: - other: "chưa tới %{count} giây" + other: "ít hơn %{count} giây" over_x_years: - other: "hơn %{count} năm" + other: "trên %{count} năm" x_days: other: "%{count} ngày" x_minutes: @@ -2332,7 +2368,7 @@ vi: other: "%{count} giây" units: minute_abbreviated: - other: "mins" + other: "phút" hour: other: "hours" day: @@ -2340,7 +2376,7 @@ vi: description_active: "Đang hoạt động?" description_attachment_toggle: "Hiển thị/ẩn các đính kèm" description_autocomplete: > - Trường này sử dụng tính năng tự động hoàn tất. Khi bạn gõ tiêu đề của một gói công việc, bạn sẽ nhận được danh sách các ứng viên có thể. Chọn một bằng cách sử dụng phím mũi tên lên và xuống và chọn nó bằng phím tab hoặc enter. Ngoài ra, bạn có thể nhập số gói công việc trực tiếp. + Trường này sử dụng tính năng tự động hoàn thành. Trong khi nhập tiêu đề của gói công việc, bạn sẽ nhận được danh sách các ứng viên tiềm năng. Chọn một bằng cách sử dụng phím mũi tên lên và mũi tên xuống và chọn nó bằng tab hoặc enter. Ngoài ra, bạn có thể nhập trực tiếp số gói công việc. description_available_columns: "Cột có sẵn" description_choose_project: "Các dự án" description_compare_from: "So sánh từ" @@ -2370,162 +2406,168 @@ vi: direction: ltr ee: features: - baseline_comparison: Baseline Comparisons - board_view: Advanced Boards - calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting - internal_comments: Internal Comments - custom_actions: Custom Actions - custom_field_hierarchies: Hierarchies - customize_life_cycle: Customize Life Cycle - date_alerts: Date Alerts - define_custom_style: Custom theme and logo - edit_attribute_groups: Edit Attribute Groups - gantt_pdf_export: Gantt PDF Export - ldap_groups: LDAP users and group sync - nextcloud_sso: Single Sign-On for Nextcloud Storage - one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage - placeholder_users: Placeholder Users - portfolio_management: Portfolio management - project_list_sharing: Project List Sharing - readonly_work_packages: Readonly Work Packages - scim_api: SCIM server API - sso_auth_providers: Single Sign-On - team_planner_view: Team Planner View - virus_scanning: Antivirus Scanning - weighted_item_lists: Weighted item lists - work_package_query_relation_columns: Work Package Query Relation Columns - work_package_sharing: Share work packages with external users - work_package_subject_generation: Work Package Subject Generation + baseline_comparison: So sánh cơ bản + board_view: Bảng nâng cao + calculated_values: Giá trị được tính toán + capture_external_links: Chụp liên kết bên ngoài + internal_comments: Bình luận nội bộ + custom_actions: Hành động tùy chỉnh + custom_field_hierarchies: hệ thống phân cấp + customize_life_cycle: Tùy chỉnh vòng đời + date_alerts: Cảnh báo ngày + define_custom_style: Chủ đề và logo tùy chỉnh + edit_attribute_groups: Chỉnh sửa nhóm thuộc tính + gantt_pdf_export: Xuất PDF Gantt + ldap_groups: Đồng bộ hóa nhóm và người dùng LDAP + mcp_server: Máy chủ MCP + nextcloud_sso: Đăng nhập một lần để lưu trữ Nextcloud + one_drive_sharepoint_file_storage: Lưu trữ tệp OneDrive/SharePoint + placeholder_users: Người dùng giữ chỗ + portfolio_management: Quản lý danh mục đầu tư + project_creation_wizard: Yêu cầu khởi tạo dự án + project_list_sharing: Chia sẻ danh sách dự án + readonly_work_packages: Gói công việc chỉ đọc + scim_api: API máy chủ SCIM + sso_auth_providers: Đăng nhập một lần + team_planner_view: Chế độ xem kế hoạch nhóm + virus_scanning: Quét virus + weighted_item_lists: Danh sách mặt hàng có trọng số + work_package_query_relation_columns: Cột quan hệ truy vấn gói công việc + work_package_sharing: Chia sẻ gói công việc với người dùng bên ngoài + work_package_subject_generation: Tạo chủ đề gói công việc upsell: buy_now_button: "Mua ngay" - plans_title: "Enterprise plans" - title: "Tiện ích mở rộng doanh nghiệp" - plan_title: "Enterprise %{plan} add-on" - plan_name: "%{plan} enterprise plan" - plan_text_html: "Available starting with the %{plan_name}." + plans_title: "Kế hoạch doanh nghiệp" + title: "Tiện ích bổ sung dành cho doanh nghiệp" + plan_title: "Tiện ích bổ sung %{plan} dành cho doanh nghiệp" + plan_name: "%{plan} kế hoạch doanh nghiệp" + plan_text_html: "Có sẵn bắt đầu với %{plan_name}." unlimited: "Không giới hạn" already_have_token: > - Already have a token? Add it using the button below to upgrade to the booked Enterprise plan. - hide_banner: "Hide this banner" + Bạn đã có mã thông báo chưa? Thêm nó bằng nút bên dưới để nâng cấp lên gói Enterprise đã đặt. + hide_banner: "Ẩn biểu ngữ này" homescreen_description: > - Enterprise plans extend the Community edition of OpenProject with additional [Enterprise add-ons](enterprise_url) and professional support, ideal for organizations running OpenProject in a mission-critical environment. - homescreen_subline: By upgrading, you will also be supporting an open source project. + Các gói doanh nghiệp mở rộng phiên bản Cộng đồng của OpenProject với [Enterprise add-ons](enterprise_url) bổ sung và hỗ trợ chuyên nghiệp, lý tưởng cho các tổ chức chạy OpenProject trong môi trường quan trọng. + homescreen_subline: Bằng cách nâng cấp, bạn cũng sẽ hỗ trợ một dự án nguồn mở. baseline_comparison: - description: Nổi bật các thay đổi đã thực hiện đối với danh sách này kể từ bất kỳ thời điểm nào trong quá khứ. + description: Đánh dấu những thay đổi được thực hiện trong danh sách này kể từ bất kỳ thời điểm nào trong quá khứ. benefits: - description: "Những lợi ích của phiên bản Enterprise tại chỗ là gì?" + description: "Lợi ích của phiên bản Enterprise tại chỗ là gì?" high_security: "Tính năng bảo mật" high_security_text: "Đăng nhập một lần (SAML, OpenID Connect, CAS), nhóm LDAP." installation: "Hỗ trợ cài đặt" - installation_text: "Các kỹ sư phần mềm có kinh nghiệm sẽ hướng dẫn bạn qua toàn bộ quá trình cài đặt và cấu hình trong hạ tầng của bạn." - premium_features: "Phần mở rộng Enterprise" - premium_features_text: "Bảng Agile, chủ đề và logo tùy chỉnh, đồ thị, quy trình làm việc thông minh với các hành động tùy chỉnh, tìm kiếm toàn văn cho các tệp đính kèm công việc và trường tùy chỉnh nhiều chọn." + installation_text: "Các kỹ sư phần mềm có kinh nghiệm sẽ hướng dẫn bạn thực hiện quá trình cài đặt và thiết lập hoàn chỉnh trong cơ sở hạ tầng của riêng bạn." + premium_features: "Tiện ích bổ sung dành cho doanh nghiệp" + premium_features_text: "Bảng linh hoạt, chủ đề và logo tùy chỉnh, đồ thị, quy trình làm việc thông minh với các hành động tùy chỉnh, tìm kiếm toàn văn cho tệp đính kèm gói công việc và các trường tùy chỉnh nhiều lựa chọn." professional_support: "Hỗ trợ chuyên nghiệp" - professional_support_text: "Nhận hỗ trợ tin cậy, tận tâm từ các kỹ sư hỗ trợ cấp cao với kiến thức chuyên môn về việc chạy OpenProject trong môi trường kinh doanh quan trọng." + professional_support_text: "Nhận được sự hỗ trợ đáng tin cậy, liên tục từ các kỹ sư hỗ trợ cấp cao có kiến ​​thức chuyên môn về việc chạy OpenProject trong các môi trường quan trọng trong kinh doanh." work_package_subject_generation: - description: "Create automatically generated subjects using referenced attributes and text." + description: "Tạo chủ đề được tạo tự động bằng cách sử dụng các thuộc tính và văn bản được tham chiếu." customize_life_cycle: - description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + description: "Tạo và tổ chức các giai đoạn dự án khác với các giai đoạn được cung cấp bởi việc lập kế hoạch chu trình dự án PM2." + capture_external_links: + description: "Ngăn chặn các cuộc tấn công xã hội bằng cách phát hiện và cảnh báo về các liên kết bên ngoài trước khi người dùng truy cập vào chúng." work_package_query_relation_columns: - description: "Need to see relations or child elements in the work package list?" + description: "Cần xem các mối quan hệ hoặc các phần tử con trong danh sách gói công việc?" edit_attribute_groups: - description: "Customize form configuration with these additional add-ons:" + description: "Tùy chỉnh cấu hình biểu mẫu với các tiện ích bổ sung sau:" features: - groups: "Thêm 1 nhóm thuộc tính" - rename: "Rename attribute groups" - related: "Add a table of related work packages" + groups: "Thêm nhóm thuộc tính mới" + rename: "Đổi tên nhóm thuộc tính" + related: "Thêm bảng các gói công việc liên quan" readonly_work_packages: - description: "Mark work packages as read-only for specific statuses." + description: "Đánh dấu các gói công việc là chỉ đọc đối với các trạng thái cụ thể." custom_field_hierarchies: - description: "Hierarchy custom fields allow organizing hierarchical structures in work packages and projects by making use of multi-level select lists." + description: "Các trường tùy chỉnh phân cấp cho phép tổ chức các cấu trúc phân cấp trong các gói công việc và dự án bằng cách sử dụng danh sách chọn nhiều cấp." date_alerts: - description: "Với cảnh báo ngày, bạn sẽ được thông báo về các ngày bắt đầu hoặc kết thúc sắp tới để không bao giờ bỏ lỡ hoặc quên hạn chót quan trọng." + description: "Với tính năng cảnh báo ngày, bạn sẽ được thông báo về ngày bắt đầu hoặc ngày kết thúc sắp tới để không bao giờ bỏ lỡ hoặc quên thời hạn quan trọng." weighted_item_lists: - description: "Weighted item lists allow you to create a list with underlying numeric values associated." + description: "Danh sách mục có trọng số cho phép bạn tạo danh sách có các giá trị số cơ bản được liên kết." work_package_sharing: - description: "Chia sẻ gói công việc với người dùng không phải là thành viên của dự án." + description: "Chia sẻ các gói công việc với người dùng không phải là thành viên của dự án." project_list_sharing: - description: "Share project lists with individual users." + description: "Chia sẻ danh sách dự án với người dùng cá nhân." calculated_values: - description: "Calculated values allow you to create a mathematical formula based attribute using numeric values and other project attributes and custom fields." + description: "Các giá trị được tính toán cho phép bạn tạo thuộc tính dựa trên công thức toán học bằng cách sử dụng các giá trị số cũng như các thuộc tính dự án và trường tùy chỉnh khác." define_custom_style: - title: "Custom color theme and logo" - more_info: "Lưu ý: logo sử dụng sẽ được công khai truy cập." - description: Tùy chỉnh cài đặt OpenProject của bạn với logo và màu sắc riêng. + title: "Chủ đề và logo màu tùy chỉnh" + more_info: "Lưu ý: logo được sử dụng sẽ có thể truy cập công khai." + description: Tùy chỉnh cài đặt OpenProject bằng logo và màu sắc của riêng bạn. custom_actions: - title: "Tác vụ tùy chỉnh" - description: "Hành động tùy chỉnh là các phím tắt một lần để thực hiện một tập hợp các hành động đã được định trước mà bạn có thể làm cho sẵn có trên các gói công việc nhất định dựa trên trạng thái, vai trò, loại hoặc dự án." + title: "Hành động tùy chỉnh" + description: "Hành động tùy chỉnh là các phím tắt bằng một cú nhấp chuột tới một tập hợp các hành động được xác định trước mà bạn có thể cung cấp trên các gói công việc nhất định dựa trên trạng thái, vai trò, loại hoặc dự án." + mcp_server: + description: "Tích hợp các tác nhân AI với phiên bản OpenProject của bạn thông qua MCP." nextcloud_sso: - title: "Single Sign-On for Nextcloud Storage" - description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." + title: "Đăng nhập một lần để lưu trữ Nextcloud" + description: "Cho phép xác thực liền mạch và an toàn cho bộ lưu trữ Nextcloud của bạn bằng Đăng nhập một lần. Đơn giản hóa việc quản lý truy cập và nâng cao sự thuận tiện cho người dùng." scim_api: - title: "SCIM clients" - description: "Automate user management in OpenProject by seamlessly integrating external identity services like Microsoft Entra or Keycloak through our SCIM Server API. Available starting with the Enterprise corporate plan." + title: "khách hàng SCIM" + description: "Tự động hóa việc quản lý người dùng trong OpenProject bằng cách tích hợp liền mạch các dịch vụ nhận dạng bên ngoài như Microsoft Entra hoặc Keycloak thông qua API máy chủ SCIM của chúng tôi. Có sẵn bắt đầu với gói doanh nghiệp Enterprise." sso_auth_providers: - title: "Single Sign-On (SSO)" - description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." + title: "Đăng nhập một lần (SSO)" + description: "Cho phép người dùng đăng nhập thông qua các nhà cung cấp SSO bên ngoài bằng SAML hoặc OpenID Connect để truy cập và tích hợp liền mạch với các hệ thống nhận dạng hiện có." virus_scanning: - description: "Đảm bảo các tệp tải lên trong OpenProject được quét virus trước khi được người dùng khác truy cập." + description: "Đảm bảo các tệp được tải lên trong OpenProject được quét vi-rút trước khi người dùng khác có thể truy cập được." + project_creation_wizard: + description: "Tạo một trình hướng dẫn từng bước để hỗ trợ các nhà quản lý dự án điền vào đơn yêu cầu khởi tạo dự án." placeholder_users: - title: Người dùng giả định + title: Người dùng giữ chỗ description: > - Người dùng giả định là cách để gán các gói công việc cho người dùng không thuộc dự án của bạn. Chúng có thể hữu ích trong nhiều tình huống; ví dụ, nếu bạn cần theo dõi các nhiệm vụ cho một nguồn lực chưa được đặt tên hoặc chưa có sẵn, hoặc nếu bạn không muốn cấp quyền truy cập cho người đó vào OpenProject nhưng vẫn muốn theo dõi các nhiệm vụ được gán cho họ. + Người dùng giữ chỗ là một cách để gán các gói công việc cho những người dùng không thuộc dự án của bạn. Chúng có thể hữu ích trong nhiều tình huống khác nhau; ví dụ: nếu bạn cần theo dõi các nhiệm vụ cho một tài nguyên chưa được đặt tên hoặc chưa có sẵn hoặc nếu bạn không muốn cấp cho người đó quyền truy cập vào OpenProject nhưng vẫn muốn theo dõi các nhiệm vụ được giao cho họ. internal_comments: - title: Internal comments - description: "Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to certain project roles and will never be visible publicly." + title: Bình luận nội bộ + description: "Nhận xét nội bộ cho phép một nhóm nội bộ liên lạc riêng tư với nhau. Những thông tin này chỉ hiển thị với một số vai trò dự án nhất định và sẽ không bao giờ hiển thị công khai." internal_comments_inline: - title: "Write internal comments only a small group can see" + title: "Viết bình luận nội bộ chỉ một nhóm nhỏ mới có thể xem" description: " " portfolio_management: - description: Align your projects to your strategic goals by organizing them into portfolios and programs. + description: Điều chỉnh các dự án của bạn theo mục tiêu chiến lược bằng cách sắp xếp chúng thành danh mục đầu tư và chương trình. teaser: title: - other: "%{count} days left of %{trial_plan} trial token" - description: "You have access to all %{trial_plan} features." + other: "%{count} ngày còn lại của %{trial_plan} mã thông báo dùng thử" + description: "Bạn có quyền truy cập vào tất cả các tính năng %{trial_plan}." trial: - not_found: "You have requested a trial token, but that request is no longer available. Please try again." - wait_for_confirmation: "We sent you an email to confirm your address in order to retrieve a trial token." + not_found: "Bạn đã yêu cầu mã thông báo dùng thử nhưng yêu cầu đó không còn nữa. Vui lòng thử lại." + wait_for_confirmation: "Chúng tôi đã gửi cho bạn một email để xác nhận địa chỉ của bạn nhằm lấy mã thông báo dùng thử." already_retrieved: > - Your trial enterprise token was already retrieved. Please check your emails for the token being attached. Please reach out to our support team if you need a new one. - successfully_saved: "Your trial enterprise token has been successfully retrieved." - token_sent: "Trial token requested" - request_again: "Request again" - resend_action: "Resend confirmation email" - welcome_title: "Quick feature overview" - welcome_description: "Nhận cái nhìn nhanh về quản lý dự án và hợp tác nhóm với phiên bản Enterprise của OpenProject." + Mã thông báo doanh nghiệp dùng thử của bạn đã được truy xuất. Vui lòng kiểm tra email của bạn để biết mã thông báo được đính kèm. Vui lòng liên hệ với nhóm hỗ trợ của chúng tôi nếu bạn cần một cái mới. + successfully_saved: "Mã thông báo doanh nghiệp dùng thử của bạn đã được truy xuất thành công." + token_sent: "Đã yêu cầu mã thông báo dùng thử" + request_again: "Yêu cầu lại" + resend_action: "Gửi lại email xác nhận" + welcome_title: "Tổng quan về tính năng nhanh" + welcome_description: "Nhận tổng quan nhanh về quản lý dự án và cộng tác nhóm với phiên bản OpenProject Enterprise." confirmation_info: > - We sent you an email on %{date} to %{email} with all the information to start the free trial of OpenProject Enterprise. Please check your inbox and click the confirmation link provided to start your 14-day free trial. + Chúng tôi đã gửi cho bạn email theo số %{date} tới %{email} kèm theo tất cả thông tin để bắt đầu dùng thử miễn phí OpenProject Enterprise. Vui lòng kiểm tra hộp thư đến của bạn và nhấp vào liên kết xác nhận được cung cấp để bắt đầu dùng thử miễn phí 14 ngày. confirmation_subline: > - Please, check your inbox and follow the steps to start your 14-day free trial. - domain_caption: The token will be valid for your currently configured host name. + Vui lòng kiểm tra hộp thư đến của bạn và làm theo các bước để bắt đầu dùng thử miễn phí 14 ngày. + domain_caption: Mã thông báo sẽ hợp lệ cho tên máy chủ hiện được định cấu hình của bạn. receive_newsletter_html: > - I want to receive the OpenProject newsletter. + Tôi muốn nhận bản tin OpenProject . consent_html: > - I agree with the terms of service and the privacy policy. + Tôi đồng ý với điều khoản dịch vụchính sách quyền riêng tư. email_calendar_updates: state: - disabled: "Disabled." - enabled: "Enabled." + disabled: "Tàn tật." + enabled: "Đã bật." button: - disabled: "Enable" - enabled: "Disable" + disabled: "Kích hoạt" + enabled: "vô hiệu hóa" enumeration_activities: "Theo dõi hoạt động" enumeration_work_package_priorities: "Độ ưu tiên của work package" - enumeration_reported_project_statuses: "Reported status" - enumeration_caption_order_changed: "Order successfully changed." - enumeration_could_not_be_moved: "Enumeration could not be moved." + enumeration_reported_project_statuses: "Trạng thái được báo cáo" + enumeration_caption_order_changed: "Đơn hàng đã được thay đổi thành công." + enumeration_could_not_be_moved: "Việc liệt kê không thể di chuyển được." enterprise_trials: dialog_component: - title: Enterprise Trial + title: Bản dùng thử doanh nghiệp error_auth_source_sso_failed: "Đăng nhập một lần (SSO) cho người dùng '%{value}' không thành công" error_can_not_archive_project: "Dự án này không thể lưu trữ: %{errors}" error_can_not_delete_entry: "Không thể xoá" error_can_not_delete_custom_field: "Không thể xóa mục tùy biến" - error_can_not_delete_in_use_archived_undisclosed: "Cũng có các gói công việc trong các dự án đã lưu trữ. Bạn cần yêu cầu quản trị viên thực hiện việc xóa để xem các dự án bị ảnh hưởng." - error_can_not_delete_in_use_archived_work_packages: "Cũng có các gói công việc trong các dự án đã lưu trữ. Bạn cần kích hoạt lại các dự án sau trước khi thay đổi thuộc tính của các gói công việc tương ứng: %{archived_projects_urls}" + error_can_not_delete_in_use_archived_undisclosed: "Ngoài ra còn có các gói công việc trong các dự án lưu trữ. Bạn cần yêu cầu quản trị viên thực hiện việc xóa để xem dự án nào bị ảnh hưởng." + error_can_not_delete_in_use_archived_work_packages: "Ngoài ra còn có các gói công việc trong các dự án lưu trữ. Trước tiên, bạn cần kích hoạt lại các dự án sau trước khi có thể thay đổi thuộc tính của các gói công việc tương ứng: %{archived_projects_urls}" error_can_not_delete_type: explanation: 'Loại này chứa các gói công việc và không thể bị xóa. Bạn có thể xem tất cả các gói công việc bị ảnh hưởng trong cái nhìn này.' error_can_not_delete_standard_type: "Kiểu chuẩn không thể bị xóa." @@ -2536,35 +2578,35 @@ vi: error_can_not_unarchive_project: "Dự án này không thể lưu trữ: %{errors}" error_check_user_and_role: "Hãy chọn người dùng và một vai trò." error_code: "Lỗi %{code}" - error_color_could_not_be_saved: "Màu sắc không thể được lưu" - error_cookie_missing: "Cookie OpenProject bị thiếu. Vui lòng đảm bảo rằng cookies được bật, vì ứng dụng này sẽ không hoạt động đúng nếu không có cookies." + error_color_could_not_be_saved: "Không thể lưu màu" + error_cookie_missing: "Cookie OpenProject bị thiếu. Hãy đảm bảo rằng cookie đã được bật vì ứng dụng này sẽ không hoạt động bình thường nếu không có cookie." error_custom_option_not_found: "Tùy chọn không tồn tại." - error_enterprise_plan_needed: "You need the %{plan} enterprise plan to perform this action." + error_enterprise_plan_needed: "Bạn cần có gói doanh nghiệp %{plan} để thực hiện hành động này." error_enterprise_activation_user_limit: "Không thể kích hoạt tài khoản của bạn (đã đạt đến giới hạn người dùng). Vui lòng liên hệ với quản trị viên của bạn để có quyền truy cập." - error_enterprise_token_invalid_domain: "Phiên bản Enterprise không hoạt động. Miền của token Enterprise của bạn (%{actual}) không khớp với tên máy chủ của hệ thống (%{expected})." + error_enterprise_token_invalid_domain: "Phiên bản Enterprise không hoạt động. Miền mã thông báo Doanh nghiệp của bạn (%{actual}) không khớp với tên máy chủ của hệ thống (%{expected})." error_failed_to_delete_entry: "Không xóa được mục này." error_in_dependent: "Lỗi khi cố gắng thay đổi đối tượng phụ thuộc: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" - error_in_new_dependent: "Lỗi khi cố gắng tạo đối tượng phụ thuộc: %{dependent_class} - %{related_subject}: %{error}" + error_in_new_dependent: "Lỗi khi tạo đối tượng phụ thuộc: %{dependent_class} - %{related_subject}: %{error}" error_invalid_selected_value: "Giá trị đã chọn không hợp lệ." - error_journal_attribute_not_present: "Nhật ký không chứa thuộc tính %{attribute}." - error_pdf_export_too_many_columns: "Quá nhiều cột được chọn cho xuất PDF. Vui lòng giảm số lượng cột." - error_pdf_date_range_too_long: "The selected work package date range exceeds the allowable PDF export limit. Please condense the range to a maximum of %{years} years." - error_pdf_failed_to_export: "Xuất PDF không thể được lưu: %{error}" - error_token_authenticity: "Không thể xác minh token Cross-Site Request Forgery. Bạn có cố gắng gửi dữ liệu trên nhiều trình duyệt hoặc tab không? Vui lòng đóng tất cả các tab và thử lại." - error_reminder_not_found: "The reminder was not found or was already notified about." + error_journal_attribute_not_present: "Tạp chí không chứa thuộc tính %{attribute}." + error_pdf_export_too_many_columns: "Đã chọn quá nhiều cột để xuất PDF. Vui lòng giảm số lượng cột." + error_pdf_date_range_too_long: "Phạm vi ngày của gói công việc đã chọn vượt quá giới hạn xuất PDF cho phép. Vui lòng thu gọn phạm vi tối đa %{years} năm." + error_pdf_failed_to_export: "Không thể lưu bản xuất PDF: %{error}" + error_token_authenticity: "Không thể xác minh mã thông báo giả mạo yêu cầu trên nhiều trang web. Bạn đã thử gửi dữ liệu trên nhiều trình duyệt hoặc tab chưa? Vui lòng đóng tất cả các tab và thử lại." + error_reminder_not_found: "Không tìm thấy lời nhắc hoặc đã được thông báo về nó." error_work_package_not_found_in_project: "Work package không được tìm thấy hoặc không thuộc về dự án này" - error_work_package_id_not_found: "Không tìm thấy gói công việc." + error_work_package_id_not_found: "Gói công việc không được tìm thấy." error_must_be_project_member: "phải là thành viên dự án" - error_migrations_are_pending: "Cài đặt OpenProject của bạn có các di trú cơ sở dữ liệu đang chờ xử lý. Có thể bạn đã bỏ lỡ việc chạy các di trú trong lần nâng cấp gần nhất. Vui lòng kiểm tra hướng dẫn nâng cấp để nâng cấp cài đặt của bạn đúng cách." - error_migrations_visit_upgrade_guides: "Vui lòng truy cập hướng dẫn nâng cấp của chúng tôi" + error_migrations_are_pending: "Bản cài đặt OpenProject của bạn có quá trình di chuyển cơ sở dữ liệu đang chờ xử lý. Bạn có thể đã bỏ lỡ quá trình di chuyển trong lần nâng cấp gần đây nhất của mình. Vui lòng kiểm tra hướng dẫn nâng cấp để nâng cấp đúng cách cài đặt của bạn." + error_migrations_visit_upgrade_guides: "Vui lòng truy cập tài liệu hướng dẫn nâng cấp của chúng tôi" error_no_default_work_package_status: 'Không có tình trạng mặc định được định nghĩa cho work package. Vui lòng kiểm tra cấu hình của bạn (đi đến "Quản lý-> các trạng thái của work package").' error_no_type_in_project: "Không có kiểu được liên kết với dự án này. Hãy kiểm tra lại phần \"Thiết Lập Dự Án\"." error_omniauth_registration_timed_out: "Đăng ký thông qua một nhà cung cấp bên ngoài xác thực hết thời gian. Xin vui lòng thử lại." - error_omniauth_invalid_auth: "Thông tin xác thực trả về từ nhà cung cấp danh tính không hợp lệ. Vui lòng liên hệ với quản trị viên của bạn để được trợ giúp thêm." + error_omniauth_invalid_auth: "Thông tin xác thực được trả về từ nhà cung cấp danh tính không hợp lệ. Vui lòng liên hệ với quản trị viên của bạn để được trợ giúp thêm." error_password_change_failed: "Đã xảy ra lỗi khi cố gắng thay đổi mật khẩu." error_scm_command_failed: "Lỗi xảy ra khi truy cập vào kho lưu trữ: %{value}" error_scm_not_found: "Mục hay revision không được tìm thấy trong kho." - error_type_could_not_be_saved: "Loại không thể được lưu" + error_type_could_not_be_saved: "Không thể lưu loại" error_unable_delete_status: "Trạng thái work package không thể bị xóa vì nó được sử dụng bởi ít nhất 1 work package." error_unable_delete_default_status: "Không thể xoá tình trạng mặc định của work package. Vui lòng chọn tình trạng work package khác trước khi xóa một trong hiện tại." error_unable_to_connect: "Không thể kết nối (%{value})" @@ -2575,16 +2617,16 @@ vi: error_menu_item_not_created: Không thể thêm mục trình đơn error_menu_item_not_saved: Không thể lưu mục trình đơn error_wiki_root_menu_item_conflict: > - Không thể đổi tên "%{old_name}" thành "%{new_name}" do có xung đột giữa mục menu kết quả với mục menu hiện tại "%{existing_caption}" (%{existing_identifier}). - error_external_authentication_failed_message: "An error occurred during external authentication: %{message}" - error_attribute_not_highlightable: "Thuộc tính(s) không thể tô sáng: %{attributes}" + Không thể đổi tên "%{old_name}" thành "%{new_name}" do xung đột giữa mục menu kết quả với mục menu hiện có "%{existing_caption}" (%{existing_identifier}). + error_external_authentication_failed_message: "Đã xảy ra lỗi trong quá trình xác thực bên ngoài: %{message}" + error_attribute_not_highlightable: "(Các) thuộc tính không thể đánh dấu: %{attributes}" events: changeset: "Đã chỉnh sửa Changeset (bộ thay đổi)" message: Đã chỉnh sửa tin nhắn - news: Tin tức - project_details: "Project details edited" - project: "Đã chỉnh sửa dự án" - projects: "Dự án đã được chỉnh sửa" + news: tin tức + project_details: "Chi tiết dự án đã được chỉnh sửa" + project: "Dự án đã chỉnh sửa" + projects: "Dự án đã chỉnh sửa" reply: Đã phản hồi time_entry: "Đã chỉnh sửa Timelog" wiki_page: "Đã chỉnh sửa trang Wiki" @@ -2593,15 +2635,15 @@ vi: work_package_note: "Đã thêm ghi chú của work package" title: project: "Dự án: %{name}" - subproject: "Dự án con: %{name}" + subproject: "Tiểu dự án: %{name}" export: dialog: - title: "Xuất" - submit: "Xuất" + title: "xuất khẩu" + submit: "xuất khẩu" save_export_settings: - label: "Save settings" + label: "Lưu cài đặt" format: - label: "Định dạng tệp tin" + label: "Định dạng tệp" options: csv: label: "CSV" @@ -2611,115 +2653,115 @@ vi: label: "XLS" columns: input_label_report: "Thêm cột vào bảng thuộc tính" - input_caption_report: "Theo mặc định, tất cả các thuộc tính được thêm vào dưới dạng cột trong danh sách gói công việc đều được chọn. Các trường văn bản dài không có trong bảng thuộc tính, nhưng có thể được hiển thị bên dưới." - input_caption_table: "Theo mặc định, tất cả các thuộc tính được thêm vào dưới dạng cột trong danh sách gói công việc đều được chọn. Các trường văn bản dài không khả dụng trong xuất dựa trên bảng." - input_caption_required: "It is not possible to export the view without any column. Please add at least one column." + input_caption_report: "Theo mặc định, tất cả các thuộc tính được thêm dưới dạng cột trong danh sách gói công việc đều được chọn. Các trường văn bản dài không có sẵn trong bảng thuộc tính nhưng có thể hiển thị bên dưới nó." + input_caption_table: "Theo mặc định, tất cả các thuộc tính được thêm dưới dạng cột trong danh sách gói công việc đều được chọn. Các trường văn bản dài không có sẵn khi xuất theo bảng." + input_caption_required: "Không thể xuất chế độ xem mà không có bất kỳ cột nào. Vui lòng thêm ít nhất một cột." pdf: export_type: label: "Loại xuất PDF" options: table: - label: "Danh sách" - caption: "Xuất danh sách các gói công việc thành một bảng có các cột mong muốn." + label: "bàn" + caption: "Xuất danh sách gói công việc trong một bảng có các cột mong muốn." report: label: "Báo cáo" - caption: "Xuất gói công việc thành báo cáo chi tiết về tất cả các gói công việc trong danh sách." + caption: "Xuất gói công việc trên một báo cáo chi tiết của tất cả các gói công việc trong danh sách." gantt: - label: "Biểu đồ Gantt" - caption: "Xuất danh sách các gói công việc theo dạng biểu đồ Gantt." + label: "biểu đồ Gantt" + caption: "Xuất danh sách gói công việc ở dạng xem sơ đồ Gantt." include_images: label: "Bao gồm hình ảnh" - caption: "Loại trừ hình ảnh để giảm kích thước của tệp PDF xuất ra." + caption: "Loại trừ hình ảnh để giảm kích thước xuất PDF." gantt_zoom_levels: - label: "Mức độ thu phóng" - caption: "Chọn mức độ thu phóng cho các ngày hiển thị trên biểu đồ." + label: "Mức thu phóng" + caption: "Chọn mức thu phóng cho các ngày được hiển thị trong biểu đồ." options: - days: "Ngày" - weeks: "Tuần" + days: "ngày" + weeks: "tuần" months: "Tháng" - quarters: "Quý" + quarters: "Khu" column_width: - label: "Chiều rộng cột bảng" + label: "Chiều rộng cột của bảng" options: - narrow: "Hẹp" - medium: "Vừa phải" - wide: "Rộng" + narrow: "Thu hẹp" + medium: "Trung bình" + wide: "rộng" very_wide: "Rất rộng" paper_size: label: "Kích thước giấy" - caption: "Tùy thuộc vào kích thước biểu đồ, có thể xuất nhiều hơn một trang." + caption: "Tùy thuộc vào kích thước biểu đồ, nhiều trang có thể được xuất." long_text_fields: input_caption: "Theo mặc định, tất cả các trường văn bản dài đều được chọn." - input_label: "Thêm các trường văn bản dài" + input_label: "Thêm trường văn bản dài" input_placeholder: "Tìm kiếm các trường văn bản dài" drag_area_label: "Quản lý các trường văn bản dài" xls: include_relations: label: "Bao gồm các mối quan hệ" - caption: "Tùy chọn này sẽ tạo bản sao của mỗi gói công việc cho mọi mối quan hệ mà nó có với một gói công việc khác." + caption: "Tùy chọn này sẽ tạo một bản sao của từng gói công việc cho mọi mối quan hệ của gói công việc này với gói công việc khác." include_descriptions: label: "Bao gồm mô tả" caption: "Tùy chọn này sẽ thêm cột mô tả ở định dạng thô." your_work_packages_export: "Các gói công việc đang được xuất khẩu" - your_projects_export: "Projects are being exported" - succeeded: "Xuất hoàn tất" + your_projects_export: "Dự án đang được xuất khẩu" + succeeded: "Đã xuất xong" failed: "Đã xảy ra lỗi khi cố gắng xuất các gói công việc: %{message}" demo: - heading: "Demo PDF" - footer: "Generated by OpenProject" - button_text: Generate Demo PDF + heading: "Bản demo PDF" + footer: "Được tạo bởi OpenProject" + button_text: Tạo bản PDF demo errors: - embedded_table_with_too_many_columns: "This embedded work package table could not fit on the page, please reduce the number of columns." + embedded_table_with_too_many_columns: "Bảng gói công việc được nhúng này không thể vừa trên trang, vui lòng giảm số lượng cột." format: atom: "Atom" csv: "CSV" pdf: "PDF" pdf_overview_table: "Bảng PDF" - pdf_report_with_images: "Báo cáo PDF với hình ảnh" + pdf_report_with_images: "Báo cáo PDF có hình ảnh" pdf_report: "Báo cáo PDF" - pdf_gantt: "Gantt PDF" + pdf_gantt: "PDF Gantt" image: omitted: "Hình ảnh không được xuất" macro: error: "Lỗi macro, %{message}" - attribute_not_found: "thuộc tính không tìm thấy: %{attribute}" + attribute_not_found: "không tìm thấy thuộc tính: %{attribute}" model_not_found: "mô hình thuộc tính không hợp lệ: %{model}" - resource_not_found: "tài nguyên không tìm thấy: %{resource}" - nested_rich_text_unsupported: "Nested rich text embedding currently not supported in export" + resource_not_found: "không tìm thấy tài nguyên: %{resource}" + nested_rich_text_unsupported: "Nhúng văn bản đa dạng thức lồng nhau hiện không được hỗ trợ khi xuất" units: hours: h - days: d + days: D pdf_generator: - page_nr_footer: "Page %{page} of %{total}" + page_nr_footer: "Trang %{page} trong số %{total}" template_attributes: - label: "Attributes and description" - caption: All the attributes present in the current form configuration using the default template. + label: "Thuộc tính và mô tả" + caption: Tất cả các thuộc tính có trong cấu hình biểu mẫu hiện tại sử dụng mẫu mặc định. template_contract: - label: "Contract" - caption: Work package details formatted to the standard German contract form. + label: "hợp đồng" + caption: Chi tiết gói công việc được định dạng theo mẫu hợp đồng tiêu chuẩn của Đức. dialog: - title: Generate PDF - submit: Tải + title: Tạo PDF + submit: tải về templates: - label: "Mẫu" - none_enabled: "No template has been enabled for this work package type" + label: "mẫu" + none_enabled: "Không có mẫu nào được bật cho loại gói công việc này" footer_center: - label: Footer text - caption: This text will appear on every page at the center of the footer. + label: Văn bản chân trang + caption: Văn bản này sẽ xuất hiện trên mỗi trang ở giữa chân trang. footer_right: - label: Footer text - caption: This text will appear on every page at the right of the footer. + label: Văn bản chân trang + caption: Văn bản này sẽ xuất hiện trên mỗi trang ở bên phải chân trang. hyphenation: - label: Hyphenation - caption: Break line between words for better layout and justification. + label: Dấu gạch nối + caption: Ngắt dòng giữa các từ để bố cục và căn chỉnh tốt hơn. hyphenation_language: - label: Language and hyphenation + label: Ngôn ngữ và dấu gạch nối page_orientation: - label: Page orientation - caption: Select the orientation of the pages in the PDF document. + label: Hướng trang + caption: Chọn hướng của các trang trong tài liệu PDF. options: - portrait: Portrait - landscape: Landscape + portrait: Chân dung + landscape: phong cảnh extraction: available: pdftotext: "Pdftotext có sẵn (không bắt buộc)" @@ -2730,14 +2772,14 @@ vi: tesseract: "Tesseract có (không bắt buộc)" filterable_tree_view: filter_mode: - all: "Tất cả" - label: "Filter mode" - selected: "Selected" - include_sub_items: "Include sub-items" - no_results_text: "No results" + all: "tất cả" + label: "Chế độ lọc" + selected: "đã chọn" + include_sub_items: "Bao gồm các mục phụ" + no_results_text: "Không có kết quả" toggle_switch: - label_on: "On" - label_off: "Off" + label_on: "trên" + label_off: "Tắt" general_csv_decimal_separator: "." general_csv_encoding: "UTF-8" general_csv_separator: "," @@ -2753,7 +2795,7 @@ vi: gui_validation_error_plural: "%{count} lỗi" homescreen: additional: - projects: "Các dự án mới nhất trong trường hợp này." + projects: "Các dự án có thể nhìn thấy mới nhất trong trường hợp này." no_visible_projects: "Không có không có thể nhìn thấy các dự án trong trường hợp này." users: "Người dùng đã đăng ký mới nhất trong trường hợp này." blocks: @@ -2762,81 +2804,79 @@ vi: title: "Nâng cấp lên phiên bản Enterprise" new_features: header: "Đọc về các tính năng mới và cập nhật sản phẩm." - learn_about: "Learn more about all new features" - missing: "There are no highlighted features yet." + learn_about: "Tìm hiểu thêm về tất cả các tính năng mới" + missing: "Chưa có tính năng nổi bật nào." #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > - The release contains various new features and improvements, such as: + Bản phát hành này bao gồm nhiều tính năng mới và cải tiến, chẳng hạn như: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Khởi tạo dự án tự động (Phần mở rộng doanh nghiệp). + line_1: "Họp: Thêm các gói công việc mới hoặc hiện có làm kết quả." + line_2: "Họp: Hiển thị phản hồi iCal trong OpenProject." + line_3: "Cuộc họp định kỳ: Sao chép các mục trong chương trình nghị sự sang lần họp tiếp theo." + line_4: "Phát hành cho cộng đồng: Tính năng làm nổi bật thuộc tính." + line_5: Cảnh báo trước khi mở các liên kết bên ngoài trong nội dung do người dùng cung cấp (Phần mở rộng doanh nghiệp). + line_6: Cải thiện hiệu suất và trải nghiệm người dùng, bao gồm tab Hoạt động và mô-đun Tài liệu. links: upgrade_enterprise_edition: "Nâng cấp lên phiên bản Enterprise" - postgres_migration: "Di chuyển cài đặt của bạn lên PostgreSQL" - user_guides: "Hướng dẫn người dùng" + postgres_migration: "Di chuyển cài đặt của bạn sang PostgreSQL" + user_guides: "Hướng dẫn sử dụng" faq: "Câu hỏi thường gặp" impressum: "Thông báo pháp lý" glossary: "Thuật ngữ" - shortcuts: "Phím tắt" + shortcuts: "phím tắt" blog: "OpenProject blog" - forums: "Diễn đàn cộng đồng" - security_alerts: "Security alerts" - newsletter: "Newsletter" + forums: "diễn đàn cộng đồng" + security_alerts: "Cảnh báo bảo mật" + newsletter: "Bản tin" image_conversion: - imagemagick: "Imagemagick" + imagemagick: "Phép thuật tưởng tượng" journals: changes_retracted: "Những thay đổi đã bị rút lại" caused_changes: dates_changed: "Ngày đã thay đổi" - default_attribute_written: "Thuộc tính chỉ đọc đã được ghi" - progress_mode_changed_to_status_based: "Cập nhật tính toán tiến độ" + default_attribute_written: "Thuộc tính chỉ đọc được viết" + progress_mode_changed_to_status_based: "Đã cập nhật tính toán tiến độ" status_changed: "Trạng thái '%{status_name}'" system_update: "Cập nhật hệ thống OpenProject:" - work_package_duplicate_closed: "Duplicate work package updated:" - total_percent_complete_mode_changed_to_work_weighted_average: "Calculation of % Complete totals now weighted by Work." - total_percent_complete_mode_changed_to_simple_average: "Calculation of % Complete totals now based on a simple average of only % Complete values." + work_package_duplicate_closed: "Gói công việc trùng lặp được cập nhật:" + total_percent_complete_mode_changed_to_work_weighted_average: "Tính toán % tổng số hoàn thành hiện được tính theo Công việc." + total_percent_complete_mode_changed_to_simple_average: "Tính toán tổng số % Hoàn thành hiện dựa trên mức trung bình đơn giản chỉ là các giá trị % Hoàn thành." cause_descriptions: - work_package_predecessor_changed_times: bởi các thay đổi đối với người tiền nhiệm %{link} - work_package_parent_changed_times: bởi các thay đổi đối với cha %{link} - work_package_children_changed_times: bởi các thay đổi đối với con %{link} - work_package_related_changed_times: bởi các thay đổi đối với liên quan %{link} - work_package_duplicate_closed: The status was automatically updated by the duplicated work package %{link} - unaccessable_work_package_changed: bởi các thay đổi đối với một gói công việc liên quan + work_package_predecessor_changed_times: bằng những thay đổi đối với người tiền nhiệm %{link} + work_package_parent_changed_times: bằng những thay đổi đối với cha mẹ %{link} + work_package_children_changed_times: bởi những thay đổi đối với con %{link} + work_package_related_changed_times: bởi những thay đổi đối với %{link} có liên quan + work_package_duplicate_closed: Trạng thái được cập nhật tự động bởi gói công việc trùng lặp %{link} + unaccessable_work_package_changed: bằng cách thay đổi gói công việc liên quan working_days_changed: - changed: "bởi các thay đổi đối với ngày làm việc (%{changes})" + changed: "do thay đổi ngày làm việc (%{changes})" days: - working: "%{day} hiện là ngày làm việc" - non_working: "%{day} hiện là ngày không làm việc" + working: "%{day} hiện đang hoạt động" + non_working: "%{day} hiện không hoạt động" dates: - working: "%{date} hiện là ngày làm việc" - non_working: "%{date} hiện là ngày không làm việc" - progress_mode_changed_to_status_based: Chế độ tính toán tiến độ đã được đặt thành chế độ dựa trên trạng thái - status_excluded_from_totals_set_to_false_message: hiện được bao gồm trong tổng số phân cấp - status_excluded_from_totals_set_to_true_message: hiện bị loại trừ khỏi tổng số phân cấp - status_percent_complete_changed: "% Complete changed from %{old_value}% to %{new_value}%" + working: "%{date} hiện đang hoạt động" + non_working: "%{date} hiện không hoạt động" + progress_mode_changed_to_status_based: Chế độ tính toán tiến độ được đặt thành dựa trên trạng thái + status_excluded_from_totals_set_to_false_message: hiện được bao gồm trong tổng số thứ bậc + status_excluded_from_totals_set_to_true_message: hiện đã bị loại khỏi tổng số thứ bậc + status_percent_complete_changed: "% Hoàn thành đã thay đổi từ %{old_value}% thành %{new_value}%" system_update: file_links_journal: > - Từ giờ trở đi, hoạt động liên quan đến liên kết tệp (các tệp lưu trữ bên ngoài) sẽ xuất hiện ở đây trong tab Hoạt động. Các hoạt động sau đây liên quan đến các liên kết đã tồn tại: + Từ giờ trở đi, hoạt động liên quan đến liên kết tệp (tệp được lưu trữ trong bộ nhớ ngoài) sẽ xuất hiện tại đây trong tab Hoạt động. Phần sau đây thể hiện hoạt động liên quan đến các liên kết đã tồn tại: progress_calculation_adjusted_from_disabled_mode: >- Tính toán tiến độ tự động được đặt thành chế độ dựa trên công việc và điều chỉnh với cập nhật phiên bản. progress_calculation_adjusted: >- Tính toán tiến độ tự động được điều chỉnh với cập nhật phiên bản. scheduling_mode_adjusted: >- - Scheduling mode automatically adjusted with version update. + Chế độ lập lịch tự động điều chỉnh khi cập nhật phiên bản. totals_removed_from_childless_work_packages: >- Tổng số công việc và tiến độ tự động bị xóa cho các gói công việc không có cha với cập nhật phiên bản. Đây là một nhiệm vụ bảo trì và có thể được bỏ qua một cách an toàn. total_percent_complete_mode_changed_to_work_weighted_average: >- - Child work packages without Work are ignored. + Các gói công việc con không có Công việc sẽ bị bỏ qua. total_percent_complete_mode_changed_to_simple_average: >- - Work values of child work packages are ignored. + Giá trị công việc của gói công việc con bị bỏ qua. links: configuration_guide: "Hướng dẫn cấu hình" get_in_touch: "Nếu bạn còn những câu hỏi khác ? Hãy liên lạc với chúng tôi" @@ -2845,103 +2885,128 @@ vi: instructions_after_error: "Bạn có thể thử đăng nhập lại bằng cách nhấn vào %{signin}. Nếu lỗi vẫn còn, yêu cầu quản trị của bạn để được giúp đỡ." menus: admin: + ai: "Trí tuệ nhân tạo (AI)" + aggregation: "sự tổng hợp" + api_and_webhooks: "API và webhook" mail_notification: "Thông báo qua email" mails_and_notifications: "Email và thông báo" - aggregation: "Tổng hợp" - api_and_webhooks: "API và webhooks" + mcp_configurations: "Giao thức Bối cảnh Mô hình (MCP)" quick_add: - label: "Add…" + label: "Thêm vào…" my_account: access_tokens: + description: "Mã thông báo của nhà cung cấp được OpenProject phát hành, cho phép các ứng dụng khác truy cập vào nó. Mã thông báo của khách hàng được phát hành bởi các ứng dụng khác, cho phép OpenProject truy cập chúng." no_results: - title: "Không có mã truy cập để hiển thị" - description: "Tất cả đã bị vô hiệu hóa. Chúng có thể được kích hoạt lại trong menu quản trị." - access_tokens: "Token truy cập" + title: "Không có mã thông báo truy cập để hiển thị" + description: "Tất cả đều đã bị vô hiệu hóa. Chúng có thể được kích hoạt lại trong menu quản trị." + access_tokens: "Mã thông báo truy cập" headers: action: "Hành động" expiration: "Hết hạn" indefinite_expiration: "Không bao giờ" - simple_revoke_confirmation: "Bạn có chắc chắn muốn thu hồi mã truy cập này không?" + simple_revoke_confirmation: "Bạn có chắc chắn muốn thu hồi mã thông báo này không?" + tabs: + client: + title: "Mã thông báo của khách hàng" + provider: + title: "Mã thông báo của nhà cung cấp" token/api: + blank_description: "Chưa có mã thông báo API. Bạn có thể tạo một cái bằng cách sử dụng nút bên dưới." + blank_title: "Không có mã thông báo API" title: "API" - text_hint: "Mã API cho phép các ứng dụng của bên thứ ba giao tiếp với phiên bản OpenProject này qua REST APIs." - disabled_text: "Mã API không được kích hoạt bởi quản trị viên. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." - add_button: "API Token" - api: - static_token_name: "Mã API" + table_title: "Mã thông báo API" + text_hint: "Mã thông báo API cho phép các ứng dụng của bên thứ ba giao tiếp với phiên bản OpenProject này thông qua API REST." + static_token_name: "Mã thông báo API" + disabled_text: "Mã thông báo API không được quản trị viên bật. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." + add_button: "Token API" ical: + blank_description: "Để thêm mã thông báo iCalendar, hãy đăng ký lịch mới hoặc lịch hiện có từ trong mô-đun Lịch của dự án. Bạn phải có các quyền cần thiết." + blank_title: "Không có mã thông báo iCalendar" title: "iCalendar" - text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." - disabled_text: "Đăng ký iCalendar không được kích hoạt bởi quản trị viên. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." - empty_text_hint: "Để thêm mã iCalendar, hãy đăng ký một lịch mới hoặc hiện có từ module Lịch của một dự án. Bạn phải có quyền cần thiết." - oauth: + table_title: "mã thông báo iCalendar" + text_hint_link: "Mã thông báo iCalendar cho phép người dùng [subscribe to OpenProject calendars](docs_url) và xem thông tin gói công việc cập nhật từ các máy khách bên ngoài." + disabled_text: "Quản trị viên không kích hoạt đăng ký iCalendar. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." + oauth_application: + active_tokens: "Mã thông báo hoạt động" + blank_description: "Không có quyền truy cập ứng dụng của bên thứ ba nào được định cấu hình và hoạt động cho bạn." + blank_title: "Không có mã thông báo ứng dụng OAuth" + last_used_at: "Được sử dụng lần cuối vào lúc" title: "OAuth" - text_hint: "Mã OAuth cho phép các ứng dụng bên thứ ba kết nối với phiên bản OpenProject này." - empty_text_hint: "Không có quyền truy cập ứng dụng bên thứ ba nào được cấu hình và hoạt động cho bạn. Vui lòng liên hệ với quản trị viên của bạn để kích hoạt tính năng này." - rss: + table_title: "Mã thông báo ứng dụng OAuth" + text_hint: "Mã thông báo ứng dụng OAuth cho phép ứng dụng của bên thứ ba kết nối với phiên bản OpenProject này." + oauth_client: + blank_description: "Chưa có mã thông báo ứng dụng khách OAuth nào." + blank_title: "Không có mã thông báo ứng dụng khách OAuth" + failed: "Đã xảy ra lỗi và không thể xóa mã thông báo. Vui lòng thử lại sau." + integration_type: "Kiểu tích hợp" + table_title: "Mã thông báo ứng dụng khách OAuth" + text_hint: "Mã thông báo ứng dụng khách OAuth cho phép phiên bản OpenProject này kết nối với các ứng dụng bên ngoài, chẳng hạn như kho lưu trữ tệp." + title: "OAuth" + remove_token: "Bạn có thực sự muốn xóa mã thông báo này không? Bạn sẽ cần phải đăng nhập lại vào %{integration}." + removed: "Đã xóa thành công mã thông báo ứng dụng khách OAuth" + unknown_integration: "không rõ" + token/rss: + add_button: "Token RSS" + blank_description: "Chưa có mã thông báo RSS. Bạn có thể tạo một cái bằng cách sử dụng nút bên dưới." + blank_title: "Không có mã thông báo RSS" title: "RSS" - text_hint: "Mã RSS cho phép người dùng theo dõi các thay đổi mới nhất trong phiên bản OpenProject này qua một trình đọc RSS bên ngoài." - static_token_name: "Mã RSS" - disabled_text: "Mã RSS không được kích hoạt bởi quản trị viên. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." + table_title: "Mã thông báo RSS" + text_hint: "Mã thông báo RSS cho phép người dùng cập nhật những thay đổi mới nhất trong phiên bản OpenProject này thông qua trình đọc RSS bên ngoài." + static_token_name: "mã thông báo RSS" + disabled_text: "Mã thông báo RSS không được quản trị viên kích hoạt. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này." storages: - title: "File storages" - text_hint: "Mã Lưu trữ Tệp kết nối phiên bản OpenProject này với một lưu trữ tệp bên ngoài." - empty_text_hint: "Không có quyền truy cập lưu trữ nào liên kết với tài khoản của bạn." - revoke_token: "Bạn có thực sự muốn xóa mã truy cập này không? Bạn sẽ cần phải đăng nhập lại trên %{storage}" - removed: "Mã Lưu trữ Tệp đã được xóa thành công" - failed: "Đã xảy ra lỗi và mã truy cập không thể được xóa. Vui lòng thử lại sau." - unknown_storage: "Lưu trữ không xác định" + unknown_storage: "Bộ nhớ không xác định" notifications: reasons: - assigned: "Người được giao" + assigned: "Người được chuyển nhượng" dateAlert: "Cảnh báo ngày" - mentioned: "Nhắc đến" - responsible: "Trách nhiệm" - shared: "Được chia sẻ" - watched: "Người quan sát" - reminder: "Reminder" + mentioned: "Được đề cập" + responsible: "chịu trách nhiệm" + shared: "đã chia sẻ" + watched: "người theo dõi" + reminder: "Lời nhắc" facets: unread: "Chưa đọc" unread_title: "Hiển thị chưa đọc" - all: "Tất cả" + all: "tất cả" all_title: "Hiển thị tất cả" menu: - by_project: "Chưa đọc theo dự án" - by_reason: "Lý do" + by_project: "Dự án chưa đọc" + by_reason: "lý do" inbox: "Hộp thư đến" send_notifications: "Gửi thông báo cho hành động này" work_packages: subject: created: "Gói công việc đã được tạo." - assigned: "Bạn đã được giao cho %{work_package}" - subscribed: "Bạn đã đăng ký nhận thông tin từ %{work_package}" + assigned: "Bạn đã được chỉ định vào %{work_package}" + subscribed: "Bạn đã đăng ký %{work_package}" mentioned: "Bạn đã được nhắc đến trong %{work_package}" - responsible: "Bạn đã trở thành người chịu trách nhiệm cho %{work_package}" - watched: "Bạn đang theo dõi %{work_package}" + responsible: "Bạn phải chịu trách nhiệm về %{work_package}" + watched: "Bạn đang xem %{work_package}" query: - invalid_filter: "Invalid notification filter" + invalid_filter: "Bộ lọc thông báo không hợp lệ" label_accessibility: "Trợ năng" - label_account: "Tài khoản" + label_account: "tài khoản" label_active: "Đang hoạt động" label_activate_user: "Người dùng kích họat" - label_active_in_new_projects: "Kích hoạt trong các dự án mới" - label_activity: "Hoạt động" + label_active_in_new_projects: "Tích cực trong các dự án mới" + label_activity: "hoạt động" label_add_edit_translations: "Thêm và chỉnh sửa bản dịch" label_add_another_file: "Thêm tập tin khác" label_add_columns: "Thêm cột đang chọn" label_add_note: "Thêm ghi chú" - label_add_projects: "Thêm các dự án" + label_add_projects: "Thêm dự án" label_add_related_work_packages: "Thêm work package liên quan" label_add_subtask: "Thêm subtask" label_added: "đã thêm" - label_added_by: "Thêm bởi %{author}" - label_added_by_on: "Added by %{author} on %{date}" + label_added_by: "Được thêm bởi %{author}" + label_added_by_on: "Được thêm bởi %{author} trên %{date}" label_added_time_by: "Thêm bởi %{author} cách đây %{age}" label_additional_workflow_transitions_for_assignee: "Chuyển đổi bổ sung được cho phép khi người sử dụng là người được gán" label_additional_workflow_transitions_for_author: "Các chuyển đổi bổ xung được phép khi người dùng là tác giả" label_administration: "Quản trị" - label_interface_colors: "Interface colors" - label_interface_colors_description: "These colors control how the application looks. If you modify them the theme will automatically be changed to Custom theme, but we can’t assure the compliance of the accessibility contrast minimums (WCAG 2.1). " + label_interface_colors: "Màu sắc giao diện" + label_interface_colors_description: "Những màu này kiểm soát giao diện của ứng dụng. Nếu bạn sửa đổi chúng, chủ đề sẽ tự động được thay đổi thành Chủ đề tùy chỉnh nhưng chúng tôi không thể đảm bảo việc tuân thủ mức độ tương phản tối thiểu về khả năng truy cập (WCAG 2.1)." label_age: "Tuổi" label_ago: "vài ngày trước" label_all: "tất cả" @@ -2951,70 +3016,71 @@ vi: label_always_visible: "Luôn luôn hiển thị" label_announcement: "Thông báo" label_angular: "AngularJS" + label_app_modules: "%{app_title} các mô-đun" label_api_access_key: "Khoá truy cập API" label_api_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}" label_api_access_key_type: "API" - label_auto_option: "(auto)" + label_auto_option: "(tự động)" label_ical_access_key_type: "iCalendar" - label_ical_access_key_description: 'Mã iCalendar "%{token_name}" cho "%{calendar_name}" trong "%{project_name}"' - label_ical_access_key_not_present: "không có mã thông báo(s) iCalendar." - label_ical_access_key_generation_hint: "Tự động tạo khi đăng ký lịch." + label_ical_access_key_description: 'Mã thông báo iCalendar "%{token_name}" cho "%{calendar_name}" trong "%{project_name}"' + label_ical_access_key_not_present: "(Các) mã thông báo iCalendar không xuất hiện." + label_ical_access_key_generation_hint: "Tự động được tạo khi đăng ký lịch." label_ical_access_key_latest: "mới nhất" label_ical_access_key_revoke: "Thu hồi" - label_add_column: "Add column" + label_add_column: "Thêm cột" label_applied_status: "Tình trạng áp dụng" label_archive_project: "Lưu trữ dự án" label_ascending: "Tăng dần" label_assigned_to_me_work_packages: "Work package được chỉ định cho tôi" label_associated_revisions: "Các phiên bản kết hợp" - label_attachment_plural: "Đính kèm" + label_attachment_plural: "tệp đính kèm" label_attribute: "Thuộc tính" label_attribute_plural: "Thuộc tính" label_ldap_auth_source_new: "Kết nối LDAP mới" label_ldap_auth_source: "Kết nối LDAP" - label_ldap_auth_source_plural: "Các kết nối LDAP" - label_attribute_expand_text: "Văn bản đầy đủ cho '%{attribute}'" + label_ldap_auth_source_plural: "Kết nối LDAP" + label_attribute_expand_text: "Toàn bộ văn bản cho '%{attribute}'" label_authentication: "Xác thực" - label_available_custom_fields_projects: "Available custom fields projects" - label_available_global_roles: "Các vai trò toàn cầu có sẵn" - label_available_project_attributes: "Các thuộc tính dự án có sẵn" - label_available_project_forums: "Các diễn đàn dự án có sẵn" + label_available_custom_fields_projects: "Các dự án trường tùy chỉnh có sẵn" + label_available_global_roles: "Vai trò toàn cầu có sẵn" + label_available_project_attributes: "Thuộc tính dự án có sẵn" + label_available_project_forums: "Diễn đàn có sẵn" label_available_project_repositories: "Kho có sẵn" label_available_project_versions: "Phiên bản sẵn có" - label_available_project_work_package_categories: "Các loại gói công việc dự án có sẵn" - label_available_project_work_package_types: "Các loại gói công việc dự án có sẵn" - label_available_projects: "Các dự án có sẵn" + label_available_project_work_package_categories: "Danh mục gói công việc có sẵn" + label_available_project_work_package_types: "Các loại gói công việc có sẵn" + label_available_projects: "Dự án có sẵn" label_api_doc: "Tài liệu API" label_backup: "Sao lưu" label_backup_code: "Mã dự phòng" - label_basic_details: "Basic details" + label_basic_details: "Chi tiết cơ bản" label_between: "giữa" label_blocked_by: "bị chặn bởi" label_blocks: "các khối" label_blog: "Nhật ký" - label_forums_locked: "Đã khóa" + label_forums_locked: "bị khóa" label_forum_new: "Diễn đàn mới" - label_forum_plural: "Diễn đàn" - label_forum_sticky: "Chú ý" + label_forum_plural: "diễn đàn" + label_forum_sticky: "dính" label_boolean: "Boolean" - label_board_plural: "Các bảng" + label_board_plural: "bảng" label_branch: "Nhánh" label_browse: "Duyệt" - label_builtin: "Built-in" + label_builtin: "Tích hợp sẵn" label_bulk_edit_selected_work_packages: "Chỉnh sửa các work package đã chọn" label_bundled: "(Tích hợp sẵn)" label_calendar: "Lịch" label_calendars_and_dates: "Lịch và ngày" label_calendar_show: "Hiển thị Lịch" - label_category: "Thể loại" - label_completed: Đã hoàn tất + label_category: "thể loại" + label_completed: Đã hoàn thành label_consent_settings: "Sự đồng ý của người dùng" label_wiki_menu_item: Khoản mục menu wiki label_select_main_menu_item: Chọn mục trình đơn chính mới label_required_disk_storage: "Ổ đĩa lưu trữ bắt buộc" label_send_invitation: Gửi lời mời - label_calculated_value: "Calculated value" - label_change_parent: "Thay đổi cha" + label_calculated_value: "Giá trị tính toán" + label_change_parent: "Thay đổi cha mẹ" label_change_plural: "Thay đổi" label_change_properties: "Thay đổi những thuộc tính" label_change_status: "Đổi trạng thái" @@ -3038,9 +3104,9 @@ vi: label_comment_added: "Đã thêm bình luận" label_comment_delete: "Xóa bình luận" label_comment_plural: "Bình luận" - label_commits_per_author: "Cam kết theo tác giả" + label_commits_per_author: "Cam kết cho mỗi tác giả" label_commits_per_month: "Commits mỗi tháng" - label_confirmation: "Xác nhận lại mật khẩu" + label_confirmation: "xác nhận" label_contains: "bao gồm" label_content: "Nội dung" label_color_plural: "Màu sắc" @@ -3051,20 +3117,20 @@ vi: label_copy_workflow_from: "Sao chép quy trình từ" label_copy_project: "Sao chép dự án" label_core_version: "Phiên bản lõi" - label_core_build: "Xây dựng lõi" - label_created_by: "Created by %{user}" + label_core_build: "Xây dựng cốt lõi" + label_created_by: "Được tạo bởi %{user}" label_current_status: "Tình trạng hiện tại" label_current_version: "Phiên bản hiện tại" label_custom_field_add_no_type: "Thêm trường này vào một loại work package" label_custom_field_new: "Thêm mục tùy biến" - label_custom_field_plural: "Tùy chỉnh mục" + label_custom_field_plural: "Trường tùy chỉnh" label_custom_field_default_type: "Kiểu rỗng" label_custom_style: "Thiết kế" - label_custom_style_description: "Choose how OpenProject looks to you with themes, select your default colors to use in the app and how exports look like." - label_dashboard: "Bảng điều khiển" + label_custom_style_description: "Chọn cách OpenProject hiển thị với bạn bằng các chủ đề, chọn màu mặc định để sử dụng trong ứng dụng và cách xuất sẽ trông như thế nào." + label_dashboard: "Trang tổng quan" label_database_version: "Phiên bản PostgreSQL" - label_date: "Ngày" - label_dates: "Dates" + label_date: "ngày" + label_dates: "ngày tháng" label_date_and_time: "Ngày và giờ" label_date_format: "Định dạng ngày" label_date_from: "Từ" @@ -3074,25 +3140,25 @@ vi: label_default: "Mặc định" label_delete_user: "Xóa người dùng" label_delete_project: "Xóa dự án" - label_delete: "Xoá" + label_delete: "xóa" label_deleted: "đã xóa" label_deleted_custom_field: "(đã xóa các mục tùy chỉnh)" - label_deleted_custom_item: "(deleted item)" + label_deleted_custom_item: "(mục đã bị xóa)" label_deleted_custom_option: "(tùy chọn đã xóa)" - label_empty_element: "(rỗng)" - label_go_back: "Go back one menu level" - label_go_forward: "Open %{module} sub-menu" - label_missing_or_hidden_custom_option: "(giá trị thiếu hoặc không có quyền truy cập)" + label_empty_element: "(trống)" + label_go_back: "Quay lại một cấp độ menu" + label_go_forward: "Mở menu phụ %{module}" + label_missing_or_hidden_custom_option: "(thiếu giá trị hoặc thiếu quyền truy cập)" label_descending: "Giảm dần" label_details: "Chi tiết" - label_defaults: "Defaults" + label_defaults: "mặc định" label_development_roadmap: "Lộ trình phát triển" label_diff: "sự khác nhau" label_diff_inline: "nội tuyến" label_diff_side_by_side: "bên cạnh nhau" - label_digital_accessibility: "Khả năng truy cập kỹ thuật số (DE)" + label_digital_accessibility: "Khả năng tiếp cận kỹ thuật số (DE)" label_disabled: "vô hiệu hoá" - label_disabled_uppercase: "VÔ HIỆU" + label_disabled_uppercase: "bị vô hiệu hóa" label_display: "Hiển thị" label_display_per_page: "Mỗi trang: %{value}" label_display_used_statuses_only: "Chỉ hiển thị trạng thái được dùng bởi kiểu này" @@ -3103,47 +3169,47 @@ vi: label_duplicate: "Nhân đôi" label_duplicates: "Nhân đôi" label_edit: "Chỉnh sửa" - label_edit_attribute: "Edit attribute" + label_edit_attribute: "Chỉnh sửa thuộc tính" label_edit_x: "Chỉnh sửa: %{x}" label_enable_multi_select: "Bật/tắt đa lựa chọn" label_enabled_project_custom_fields: "Các trường tùy chỉnh đã bật" label_enabled_project_modules: "Các mô-đun đã bật" - label_enabled_project_activities: "Hoạt động theo dõi thời gian được bật" + label_enabled_project_activities: "Đã bật hoạt động theo dõi thời gian" label_end_to_end: "kết thúc đến kết thúc" label_end_to_start: "kết thúc đến bắt đầu" label_enumeration_new: "Giá trị liệt kê mới" label_enumeration_value: "Giá trị liệt kê" label_enumerations: "Liệt kê" label_enterprise: "Doanh nghiệp" - label_enterprise_active_users: "%{current}/%{limit} người dùng đang hoạt động đã đặt chỗ" + label_enterprise_active_users: "%{current}/%{limit} đã đăng ký người dùng đang hoạt động" label_enterprise_edition: "Phiên bản doanh nghiệp" label_enterprise_support: "Hỗ trợ doanh nghiệp" label_environment: "Môi trường" - label_estimates_and_progress: "Ước lượng và tiến độ" + label_estimates_and_progress: "Ước tính và tiến độ" label_equals: "là" - label_equals_with_descendants: "is any with descendants" + label_equals_with_descendants: "có ai có con cháu không" label_everywhere: "mọi nơi" label_example: "Ví dụ" - label_experimental: "Thử nghiệm" - label_i_am_member: "Tôi là thành viên" - label_ifc_viewer: "Xem IFC" - label_ifc_model_plural: "Các mô hình IFC" + label_experimental: "thực nghiệm" + label_i_am_member: "tôi là thành viên" + label_ifc_viewer: "Trình xem Ifc" + label_ifc_model_plural: "Mô hình Ifc" label_import: "Nhập" label_export_to: "Cũng có sẵn tại:" label_expand: "Mở rộng" label_expanded_click_to_collapse: "Mở rộng. Bấm vào để thu gọn" label_f_hour: "%{value} giờ" label_f_hour_plural: "%{value} giờ" - label_favorite: "Yêu thích" + label_favorite: "yêu thích" label_feed_plural: "Nguồn cấp dữ liệu" label_feeds_access_key: "Khóa truy cập RSS" label_feeds_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}" label_feeds_access_key_type: "RSS" - label_file_plural: "Tập tin" + label_file_plural: "tập tin" label_filter: "Bộ lọc" label_filter_add: "Thêm bộ lọc" - label_filter_by: "Filter by" - label_filter_any_name_attribute: "Name attributes" + label_filter_by: "Lọc theo" + label_filter_any_name_attribute: "Thuộc tính tên" label_filter_plural: "Bộ lọc" label_filters_toggle: "Hiển thị/ẩn bộ lọc" label_float: "Số thực" @@ -3151,122 +3217,123 @@ vi: label_follows: "theo dõi" label_force_user_language_to_default: "Có một ngôn ngữ không được cho phép để mặc định trong thiết lập ngôn ngữ cho người sử dụng" label_form_configuration: "Mẫu cấu hình" - label_formula: "Formula" + label_formula: "Công thức" label_gantt_chart: "Biểu đồ Gantt" - label_gantt_chart_plural: "Biểu đồ Gantt" + label_gantt_chart_plural: "biểu đồ Gantt" label_general: "Tổng quan" label_generate_key: "Tạo khóa" - label_global_modules: "Global modules" + label_global_modules: "Mô-đun toàn cầu" label_global_roles: "Vai trò toàn cầu" label_git_path: "Đường dẫn đến thư mục .git" label_greater_or_equal: ">=" label_group_by: "Nhóm theo" label_group_new: "Nhóm mới" - label_group: "Nhóm" + label_group: "nhóm" label_group_named: "Nhóm %{name}" label_group_plural: "Các Nhóm" label_help: "Trợ giúp" label_here: đây label_hide: "Ẩn" label_history: "Lịch sử" - label_hierarchy: "Phân cấp" + label_hierarchy: "Hệ thống phân cấp" label_hierarchy_leaf: "Hệ thống phân cấp lá" label_home: "Trang chủ" label_subject_or_id: "Chủ đề hoặc Mã" label_calendar_subscriptions: "Đăng ký lịch" - label_identifier: "Định danh" + label_identifier: "định danh" label_in: "trong" label_in_less_than: "ít hơn" label_in_more_than: "nhiều hơn" label_inactive: "Không hoạt động" label_incoming_emails: "Các thư đến" label_includes: "bao gồm" - label_incomplete: Chưa hoàn tất - label_include_sub_projects: Bao gồm dự án con + label_incomplete: không đầy đủ + label_include_sub_projects: Bao gồm các tiểu dự án label_index_by_date: "Chỉ mục theo ngày" label_index_by_title: "Chỉ mục theo tiêu đề" - label_information: "Thông tin" + label_information: "thông tin" label_information_plural: "Thông tin" label_installation_guides: "Hướng dẫn cài đặt" label_integer: "Số nguyên" - label_interface: "Interface" + label_interface: "Giao diện" label_internal: "Nội bộ" - label_introduction_video: "Getting started video" + label_introduction_video: "Video bắt đầu" label_invite_user: "Mời người dùng" - label_item: "Item" - label_item_plural: "Items" - label_weighted_item_list: "Weighted item list" - label_share: "Chia sẻ" + label_item: "mục" + label_item_plural: "Mặt hàng" + label_weighted_item_list: "Danh sách mặt hàng có trọng số" + label_share: "chia sẻ" label_share_project_list: "Chia sẻ danh sách dự án" label_share_work_package: "Chia sẻ gói công việc" label_show_all_registered_users: "Hiển thị tất cả người dùng đã đăng ký" label_show_less: "Hiển thị ít hơn" - label_show_more: "Xem thêm" - label_journal: "Nhật ký" + label_show_more: "Hiển thị thêm" + label_journal: "nhật ký" label_journal_diff: "So sánh mô tả" - label_language: "Ngôn ngữ" - label_languages: "Ngôn ngữ" - label_locale: "Language and region" - label_jump_to_a_project: "Nhảy đến dự án..." + label_language: "ngôn ngữ" + label_languages: "ngôn ngữ" + label_external_links: "Liên kết ngoài" + label_locale: "Ngôn ngữ và khu vực" + label_jump_to_a_project: "Chuyển đến một dự án..." label_keyword_plural: "Từ khóa" label_language_based: "Dựa trên ngôn ngữ của người dùng" - label_last_activity: "Hoạt động gần nhất" + label_last_activity: "Hoạt động cuối cùng" label_last_change_on: "Thay đổi cuối trên" - label_last_changes: "cuối %{count} thay đổi" - label_last_login: "Lần đăng nhập trước" + label_last_changes: "%{count} thay đổi gần đây nhất" + label_last_login: "Lần đăng nhập cuối cùng" label_last_month: "tháng trước" - label_last_n_days: "trong %{count} ngày qua" + label_last_n_days: "%{count} ngày qua" label_last_week: "tuần trước" - label_latest_revision: "Phiên bản mới nhất" - label_latest_revision_plural: "Các phiên bản mới nhất" + label_latest_revision: "Bản sửa đổi mới nhất" + label_latest_revision_plural: "Phiên bản mới nhất" label_ldap_authentication: "Xác thực LDAP" label_learn_more: "Tìm hiểu thêm" label_less_or_equal: "<=" - label_less_than_ago: "ít hơn ngày trước" + label_less_than_ago: "chưa đầy ngày trước" label_link_url: "Liên kết (URL)" - label_list: "Danh sách" + label_list: "danh sách" label_loading: "Đang tải..." - label_locked: "đã khóa" + label_locked: "bị khóa" label_lock_user: "Khóa người dùng" - label_logged_as: "Đăng nhập với tư cách" + label_logged_as: "Đăng nhập như" label_login: "Đăng nhập" - label_custom_logo: "Custom logo desktop" - label_custom_logo_mobile: "Custom logo mobile" + label_custom_logo: "Máy tính để bàn logo tùy chỉnh" + label_custom_logo_mobile: "Logo tùy chỉnh di động" label_custom_export_logo: "Logo xuất khẩu tùy chỉnh" - label_custom_export_cover: "Nền bìa xuất khẩu tùy chỉnh" - label_custom_export_footer: "Custom export footer image" - label_custom_export_font_regular: "Regular" - label_custom_export_font_bold: "Bold" - label_custom_export_font_italic: "In nghiêng" - label_custom_export_font_bold_italic: "Bold Italic" - label_custom_export_cover_overlay: "Lớp phủ nền bìa xuất khẩu tùy chỉnh" - label_custom_export_cover_text_color: "Màu chữ" - label_custom_pdf_export_settings: "Cài đặt xuất khẩu PDF tùy chỉnh" + label_custom_export_cover: "Nền bìa xuất tùy chỉnh" + label_custom_export_footer: "Hình ảnh chân trang xuất tùy chỉnh" + label_custom_export_font_regular: "chính quy" + label_custom_export_font_bold: "in đậm" + label_custom_export_font_italic: "Nghiêng" + label_custom_export_font_bold_italic: "In nghiêng đậm" + label_custom_export_cover_overlay: "Lớp phủ nền bìa xuất tùy chỉnh" + label_custom_export_cover_text_color: "Màu văn bản" + label_custom_pdf_export_settings: "Cài đặt xuất PDF tùy chỉnh" label_custom_favicon: "Favicon tuỳ chỉnh" label_custom_touch_icon: "Tùy chỉnh biểu tượng ICON" label_logout: "Đăng xuất" - label_mapping_for: "Mapping for: %{attribute}" + label_mapping_for: "Ánh xạ cho: %{attribute}" label_main_menu: "Menu bên" label_manage: "Quản lý" label_manage_groups: "Quản lý nhóm" - label_managed_repositories_vendor: "Các kho lưu trữ %{vendor} được quản lý" - label_mathematical_operators: "Mathematical operators" + label_managed_repositories_vendor: "Kho lưu trữ %{vendor} được quản lý" + label_mathematical_operators: "Toán tử toán học" label_max_size: "Kích thước tối đa" label_me: "tôi" label_member_new: "Thành viên mới" - label_member_all_admin: "(Tất cả vai trò do trạng thái quản trị viên)" - label_member_plural: "Thành viên" - label_membership_plural: "Thành viên" - label_membership_added: "Thành viên đã thêm" - label_membership_updated: "Thành viên đã cập nhật" - label_menu: "Trình đơn" + label_member_all_admin: "(Tất cả các vai trò do tư cách quản trị viên)" + label_member_plural: "thành viên" + label_membership_plural: "Tư cách thành viên" + label_membership_added: "Đã thêm thành viên" + label_membership_updated: "Đã cập nhật thành viên" + label_menu: "thực đơn" label_menu_badge: - pre_alpha: "pre-alpha" + pre_alpha: "tiền alpha" alpha: "alpha" - beta: "beta" - label_menu_item_name: "Tên mục menu" - label_message: "Tin nhắn" - label_message_last: "Tin nhắn gần nhất" + beta: "THỬ NGHIỆM" + label_menu_item_name: "Tên món trong thực đơn" + label_message: "tin nhắn" + label_message_last: "Tin nhắn cuối cùng" label_message_new: "Tin nhắn mới" label_message_plural: "Tin nhắn" label_message_posted: "Đã thêm tin nhắn" @@ -3277,21 +3344,21 @@ vi: label_modification: "thay đổi %{count}" label_modified: "đã sửa đổi" label_module_plural: "Các Mô-Đun" - label_modules: "Các Mô-Đun" + label_modules: "mô-đun" label_months_from: "tháng từ" label_more: "Xem thêm" - label_more_information: "Thông tin thêm" + label_more_information: "Thêm thông tin" label_more_than_ago: "nhiều hơn mấy ngày trước" label_move_column_left: "Di chuyển cột sang trái" label_move_column_right: "Di chuyển cột sang phải" label_move_work_package: "Di chuyển work package" - label_my_account: "Account settings" + label_my_account: "Cài đặt tài khoản" label_my_activity: "Hoạt động của tôi" label_my_account_data: "Dữ liệu tài khoản của tôi" - label_my_avatar: "Ảnh đại diện của tôi" + label_my_avatar: "Hình đại diện của tôi" label_my_queries: "Các truy vấn tùy biến của tôi" - label_name: "Tên" - label_never: "Không bao giờ" + label_name: "tên" + label_never: "không bao giờ" label_new: "Mới" label_new_features: "Tính năng mới" label_new_statuses_allowed: "Trạng thái mới được phép" @@ -3301,7 +3368,7 @@ vi: label_news_latest: "Tin mới" label_news_new: "Thêm tin" label_news_edit: "Chỉnh sửa tin" - label_news_plural: "Tin tức" + label_news_plural: "tin tức" label_news_view_all: "Xem tất cả tin" label_next: "Tiếp" label_next_week: "Tuần tới" @@ -3310,31 +3377,31 @@ vi: label_no_due_date: "không có ngày kết thúc" label_no_start_date: "không có ngày bắt đầu" label_no_parent_page: "Không có trang quan hệ" - label_notification_center_plural: "Thông báo" + label_notification_center_plural: "thông báo" label_nothing_display: "Không có gì để hiển thị" label_nobody: "không ai" - label_not_configured: "Not configured" + label_not_configured: "Chưa được định cấu hình" label_not_found: "không tìm thấy" label_none: "không" label_none_parentheses: "(trống)" label_not_contains: "không chứa" label_not_equals: "không là" - label_life_cycle_step_plural: "Project life cycle" - label_on: "vào" - label_operator_all: "không rỗng" - label_operator_none: "rỗng" + label_life_cycle_step_plural: "Vòng đời dự án" + label_on: "trên" + label_operator_all: "không trống" + label_operator_none: "trống rỗng" label_operator_equals_or: "là (HOẶC)" label_operator_equals_all: "là (VÀ)" label_operator_shared_with_user_any: "bất kỳ" label_open: "mở" - label_closed: "đã đóng" + label_closed: "đóng cửa" label_open_menu: "Mở trình đơn" label_open_work_packages: "mở" label_open_work_packages_plural: "mở" label_openproject_website: "Trang web OpenProject" - label_optional_description: "Mô tả" + label_optional_description: "mô tả" label_options: "Tuỳ chọn" - label_other: "Khác" + label_other: "khác" label_overall_activity: "Tổng thể hoạt động" label_overview: "Tổng quan" label_page_title: "Tiêu đề trang" @@ -3346,17 +3413,17 @@ vi: label_password_rule_uppercase: "Chữ hoa" label_path_encoding: "Mã hóa đường dẫn" label_per_page: "Mỗi trang:" - label_people: "Người" + label_people: "mọi người" label_permissions: "Phân Quyền" label_permissions_report: "Báo cáo phân quyền" label_personalize_page: "Cá nhân hoá các trang này" - label_placeholder_user: "Người dùng tạm thời" - label_placeholder_user_new: "Người dùng giả lập mới" - label_placeholder_user_plural: "Người dùng giả định" + label_placeholder_user: "Người dùng giữ chỗ" + label_placeholder_user_new: "Người dùng giữ chỗ mới" + label_placeholder_user_plural: "Người dùng giữ chỗ" label_planning: "Lập kế hoạch" label_please_login: "Vui lòng đăng nhập" label_plugins: "Plugins" - label_portfolio_plural: "Portfolios" + label_portfolio_plural: "danh mục đầu tư" label_modules_and_plugins: "Mô-đun và Plugin" label_precedes: "trước" label_preferences: "Tùy chỉnh" @@ -3370,54 +3437,51 @@ vi: label_product_version: "Phiên bản sản phẩm" label_profile: "Hồ sơ" label_percent_complete: "% Hoàn thành" - label_progress_tracking: "Progress tracking" - label_project: "Dự án" + label_progress_tracking: "Theo dõi tiến độ" + label_project: "dự án" label_project_activity: "Hoạt động dự án" - label_project_attribute_plural: "Các thuộc tính dự án" + label_project_attribute_plural: "Thuộc tính dự án" label_project_attribute_manage_link: "Quản lý thuộc tính dự án" label_project_count: "Tổng số dự án" label_project_copy_notifications: "Gửi email thông báo trong quá trình sao chép dự án" - label_project_initiation_export_pdf: "Export PDF for %{project_creation_name}" + label_project_initiation_export_pdf: "Xuất PDF cho %{project_creation_name}" label_project_latest: "Dự án mới nhất" label_project_default_type: "Cho phép kiểu rỗng" label_project_hierarchy: "Phân cấp dự án" - label_project_mappings: "Các dự án" + label_project_mappings: "dự án" label_project_new: "Dự án mới" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" - label_project_plural: "Các dự án" + label_project_plural: "dự án" label_project_list_plural: "Danh sách dự án" - label_project_life_cycle: "Project life cycle" - label_project_attributes_plural: "Các thuộc tính dự án" - label_project_custom_field_plural: "Các thuộc tính dự án" + label_project_life_cycle: "Vòng đời dự án" + label_project_attributes_plural: "Thuộc tính dự án" + label_project_custom_field_plural: "Thuộc tính dự án" label_project_settings: "Thiết lập dự án" label_project_attributes_settings: "Cài đặt thuộc tính dự án" - label_project_storage_plural: "File storages" - label_project_storage_project_folder: "File storages: Project folders" - label_projects_disk_usage_information: "%{count} dự án đang sử dụng %{used_disk_space} dung lượng đĩa" + label_project_storage_plural: "Kho lưu trữ tập tin" + label_project_storage_project_folder: "Kho lưu trữ tệp: Thư mục dự án" + label_projects_disk_usage_information: "%{count} dự án sử dụng dung lượng đĩa %{used_disk_space}" label_project_view_all: "Xem tất cả các dự án" label_project_show_details: "Hiển thị chi tiết dự án" label_project_hide_details: "Ẩn chi tiết Dự án" - label_portfolio: "Portfolio" - label_portfolio_new: "New portfolio" - label_program: "Program" - label_program_new: "New program" + label_portfolio: "danh mục đầu tư" + label_portfolio_new: "Danh mục đầu tư mới" + label_program: "chương trình" + label_program_new: "Chương trình mới" label_public_projects: "Các dự án công khai" label_query_new: "Truy vấn mới" label_query_plural: "Truy vấn tùy chỉnh" label_read: "Đọc..." - label_read_documentation: "Read documentation" + label_read_documentation: "Đọc tài liệu" label_register: "Tạo tài khoản mới" label_register_with_developer: "Đăng ký là nhà phát triển" label_registered_on: "Ngày tham gia" label_related_work_packages: "Work package liên quan" label_relates: "liên quan đến" label_relates_to: "liên quan đến" - label_relation: "Relation" - label_relation_actions: "Relation actions" + label_relation: "quan hệ" + label_relation_actions: "Hành động quan hệ" label_relation_delete: "Xóa quan hệ" - label_relation_edit: "Edit relation" + label_relation_edit: "Chỉnh sửa mối quan hệ" label_relation_new: "Quan hệ mới" label_release_notes: "Ghi chú phát hành" label_remaining_work: "Công việc còn lại" @@ -3431,11 +3495,11 @@ vi: label_reported_work_packages: "Các gói công việc đã báo cáo" label_reporting: "Đang báo cáo" label_reporting_plural: "Đang báo cáo" - label_repository: "Kho lưu trữ" - label_repository_remove: "Remove repository" - label_repository_root: "Gốc kho lưu trữ" + label_repository: "kho lưu trữ" + label_repository_remove: "Xóa kho lưu trữ" + label_repository_root: "Kho lưu trữ gốc" label_repository_plural: "Kho lưu trữ" - label_request_submission: "Request submission" + label_request_submission: "Yêu cầu gửi" label_required: "bắt buộc" label_requires: "bắt buộc" label_result_plural: "Các kết quả" @@ -3446,21 +3510,21 @@ vi: label_roadmap_edit: "Sửa lộ trình %{name}" label_roadmap_due_in: "Hết hạn trong %{value}" label_roadmap_no_work_packages: "Không có công việc nào cho phiên bản này" - label_roadmap_overdue: "%{value} trễ hạn" + label_roadmap_overdue: "%{value} muộn" label_role_and_permissions: "Vai trò và Quyền hạn" label_role_new: "Vai trò mới" - label_role_grantable: "Grantable role" + label_role_grantable: "Vai trò có thể cấp" label_role_plural: "Vai trò" label_role_search: "Chỉ định vai trò cho các thành viên mới" label_scm: "SCM" - label_scroll_left: "Scroll left" - label_scroll_right: "Scroll right" + label_scroll_left: "Cuộn sang trái" + label_scroll_right: "Cuộn sang phải" label_search: "Tìm kiếm" label_search_by_name: "Tìm kiếm theo tên" - label_send_information: "Gửi thông tin đăng nhập mới cho người dùng" + label_send_information: "Gửi thông tin xác thực mới cho người dùng" label_send_test_email: "Gửi email thử nghiệm" - label_session: "Phiên làm việc" - label_setting_plural: "Cài đặt" + label_session: "Phiên" + label_setting_plural: "cài đặt" label_system_settings: "Cài đặt hệ thống" label_show_completed_versions: "Xem phiên bản đã hoàn thành" label_columns: "Cột" @@ -3473,48 +3537,48 @@ vi: label_sort_highest: "Lên trên cùng" label_sort_lower: "Dịch xuống" label_sort_lowest: "Chuyển đến dưới cùng" - label_spent_time: "Thời gian" + label_spent_time: "dành thời gian" label_start_to_end: "bắt đầu đến kết thúc" label_start_to_start: "bắt đầu đến bắt đầu" label_statistics: "Số liệu thống kê" - label_status: "Trạng thái" + label_status: "trạng thái" label_storage_free_space: "Dung lượng đĩa còn lại" label_storage_used_space: "Dung lượng đĩa đã sử dụng" - label_storage_group: "Hệ thống tệp lưu trữ %{identifier}" - label_storage_for: "Bao gồm lưu trữ cho" - label_string: "Văn bản" - label_subproject: "Dự án con" + label_storage_group: "Hệ thống tập tin lưu trữ %{identifier}" + label_storage_for: "Bao gồm việc lưu trữ cho" + label_string: "văn bản" + label_subproject: "dự án con" label_subproject_new: "Thêm dự án con" label_subproject_plural: "Dự án con" - label_subitems: "Subitems" + label_subitems: "mục phụ" label_subtask_plural: "Tác vụ con" label_summary: "Tóm tắt" label_system: "Hệ thống" label_system_storage: "Thông tin lưu trữ" label_table_of_contents: "Mục lục" label_tag: "Từ khóa" - label_team_planner: "Lập kế hoạch nhóm" - label_template: "Mẫu" - label_templates: "Templates" + label_team_planner: "Người lập kế hoạch nhóm" + label_template: "mẫu" + label_templates: "mẫu" label_text: "Văn bản dài" label_this_month: "tháng này" label_this_week: "tuần này" label_this_year: "năm này" - label_time: "Thời gian" - label_time_entry_plural: "Thời gian" - label_time_entry_activity_plural: "Hoạt động thời gian đã tiêu tốn" - label_title: "Tiêu đề" - label_projects_menu: "Các dự án" + label_time: "thời gian" + label_time_entry_plural: "dành thời gian" + label_time_entry_activity_plural: "Hoạt động dành thời gian" + label_title: "tiêu đề" + label_projects_menu: "dự án" label_today: "hôm nay" - label_token_version: "Token Version" - label_today_as_start_date: "Select today as start date." - label_today_as_due_date: "Select today as finish date." - label_today_as_date: "Select today as date." + label_token_version: "Phiên bản mã thông báo" + label_today_as_start_date: "Chọn hôm nay làm ngày bắt đầu." + label_today_as_due_date: "Chọn hôm nay làm ngày kết thúc." + label_today_as_date: "Chọn hôm nay làm ngày." label_top_menu: "Trình đơn trên cùng" label_topic_plural: "Các chủ đề" label_total: "Tổng cộng" label_type_new: "Kiểu mới" - label_type_plural: "Các loại" + label_type_plural: "các loại" label_ui: "Giao diện người dùng" label_updated_time: "Cập nhật cách đây %{value}" label_updated_time_at: "%{author} %{age}" @@ -3523,27 +3587,27 @@ vi: label_used_by: "Được dùng bởi" label_used_by_types: "Được sử dụng bởi các loại" label_used_in_projects: "Được sử dụng trong các dự án" - label_user: "Người dùng" + label_user: "người dùng" label_user_and_permission: "Người dùng và quyền" label_user_named: "Người dùng %{name}" label_user_activity: "%{value} hoạt động" - label_user_anonymous: "Ẩn danh" + label_user_anonymous: "vô danh" label_user_mail_option_all: "Bất kỳ sự kiện trên tất cả dự án của tôi" label_user_mail_option_none: "Không có sự kiện" label_user_mail_option_only_assigned: "Chỉ những thứ tôi được phân công" label_user_mail_option_only_my_events: "Chỉ những thứ tôi theo dõi hoặc liên quan" label_user_mail_option_only_owner: "Chỉ những thứ tôi sở hữu" - label_user_mail_option_selected: "Chỉ cho sự kiện trên các dự án đã chọn" - label_user_menu: "User menu" + label_user_mail_option_selected: "Chỉ dành cho bất kỳ sự kiện nào trên các dự án đã chọn" + label_user_menu: "Trình đơn người dùng" label_user_new: "Người dùng mới" label_user_plural: "Người dùng" label_user_search: "Tìm kiếm người dùng" label_user_settings: "Cài đặt người dùng" label_users_settings: "Cài đặt người dùng" - label_value_x: "Value: %{x}" + label_value_x: "Giá trị: %{x}" label_version_new: "Phiên bản mới" label_version_edit: "Chỉnh sửa phiên bản" - label_version_plural: "Các phiên bản" + label_version_plural: "phiên bản" label_version_sharing_descendants: "Với các dự án con" label_version_sharing_hierarchy: "Với phân cấp dự án" label_version_sharing_none: "Không được chia sẻ" @@ -3556,8 +3620,8 @@ vi: label_watched_work_packages: "Các công việc đã xem" label_what_is_this: "Đây là gì?" label_week: "Tuần" - label_widget: "Widget" - label_widget_new: "New widget" + label_widget: "tiện ích" + label_widget_new: "Tiện ích mới" label_wiki_content_added: "Đã thêm trang Wiki" label_wiki_content_updated: "Trang Wiki đã được cập nhật" label_wiki_toc: "Bảng mục lục" @@ -3568,19 +3632,19 @@ vi: label_wiki_page_attachments: "Tệp đính kèm trang Wiki" label_wiki_page_id: "ID trang Wiki" label_wiki_navigation: "Điều hướng Wiki" - label_wiki_page: "Trang wiki" + label_wiki_page: "trang Wiki" label_wiki_page_plural: "Trang wiki" label_wiki_show_index_page_link: "Hiển thị mục menu con 'Mục lục'" label_wiki_show_menu_item: "Hiển thị dưới dạng mục menu trong điều hướng dự án" label_wiki_show_new_page_link: "Hiển thị mục menu con 'Tạo trang con mới'" label_wiki_show_submenu_item: "Hiển thị dưới dạng mục menu con của" label_wiki_start: "Trang bắt đầu" - label_work: "Công việc" + label_work: "làm việc" label_work_package: "Work Package" label_work_package_attachments: "Phần đính kèm công việc" label_work_package_category_new: "Danh mục mới" label_work_package_category_plural: "Các thể loại work package" - label_work_package_comments: "Work package comments" + label_work_package_comments: "Nhận xét gói công việc" label_work_package_hierarchy: "Phân cấp công việc" label_work_package_new: "Work package mới" label_work_package_edit: "Chỉnh sửa work package %{name}" @@ -3617,19 +3681,19 @@ vi: other: "%{count} dự án" zero: "Không có dự án" label_x_files: - one: "1 tệp" + one: "1 tập tin" other: "%{count} tệp" - zero: "không có tệp" + zero: "không có tập tin" label_yesterday: "ngày hôm qua" label_zen_mode: "Chế độ Zen" - label_role_type: "Kiểu" + label_role_type: "loại" label_member_role: "Vai trò dự án" label_global_role: "Vai trò toàn cầu" label_not_changeable: "(không thể thay đổi)" - label_global: "Toàn cầu" - label_seeded_from_env_warning: This record has been created through a setting environment variable. It is not editable through UI. + label_global: "toàn cầu" + label_seeded_from_env_warning: Bản ghi này đã được tạo thông qua một biến môi trường cài đặt. Nó không thể chỉnh sửa thông qua giao diện người dùng. macro_execution_error: "Lỗi khi thực thi macro %{macro_name}" - macro_unavailable: "Macro %{macro_name} không thể được hiển thị." + macro_unavailable: "Macro %{macro_name} không thể hiển thị." macros: placeholder: "[Placeholder] Macro %{macro_name}" errors: @@ -3637,25 +3701,25 @@ vi: legacy_warning: timeline: "Macro này đã bị xóa. Bạn có thể thay thế các chức năng với một table macro." include_wiki_page: - removed: "Macro này không còn tồn tại." + removed: "Macro không còn tồn tại." wiki_child_pages: errors: page_not_found: "Không tim thấy trang wiki %{name}." create_work_package_link: errors: - no_project_context: "Gọi macro create_work_package_link từ ngoài ngữ cảnh dự án." - invalid_type: "Không tìm thấy loại với tên '%{type}' trong dự án '%{project}'." + no_project_context: "Gọi macro create_work_package_link từ ngữ cảnh bên ngoài dự án." + invalid_type: "Không tìm thấy loại nào có tên '%{type}' trong dự án '%{project}'." link_name: "Work package mới" link_name_type: "Mới %{type_name}" mail: - actions: "Hành động" + actions: "hành động" digests: - including_mention_singular: "bao gồm một lời nhắc" - including_mention_plural: "bao gồm %{number_mentioned} lời nhắc" + including_mention_singular: "trong đó có đề cập đến" + including_mention_plural: "bao gồm %{number_mentioned} lượt đề cập" unread_notification_singular: "1 thông báo chưa đọc" unread_notification_plural: "%{number_unread} thông báo chưa đọc" - you_have: "Bạn có" - logo_alt_text: "Logo" + you_have: "bạn có" + logo_alt_text: "biểu tượng" mention: subject: "%{user_name} đã nhắc đến bạn trong #%{id} - %{subject}" notification: @@ -3663,72 +3727,72 @@ vi: see_in_center: "Xem bình luận trong trung tâm thông báo" settings: "Thay đổi cài đặt email" salutation: "Xin chào %{user}" - salutation_full_name: "Họ và tên đầy đủ" + salutation_full_name: "Tên đầy đủ" work_packages: - created_at: "Tạo vào %{timestamp} bởi %{user}" - login_to_see_all: "Đăng nhập để xem tất cả thông báo." - mentioned: "Bạn đã được nhắc đến trong một bình luận" - mentioned_by: "%{user} đã nhắc đến bạn trong một bình luận" + created_at: "Được tạo tại %{timestamp} bởi %{user}" + login_to_see_all: "Đăng nhập để xem tất cả các thông báo." + mentioned: "Bạn đã được đề cập trong một nhận xét" + mentioned_by: "%{user} đã đề cập đến bạn trong nhận xét" more_to_see: other: "Có thêm %{count} gói công việc có thông báo." open_in_browser: "Mở trong trình duyệt" reason: - watched: "Đã theo dõi" - assigned: "Được chỉ định" - responsible: "Trách nhiệm" - mentioned: "Nhắc đến" - shared: "Được chia sẻ" + watched: "Đã xem" + assigned: "được giao" + responsible: "chịu trách nhiệm" + mentioned: "Được đề cập" + shared: "đã chia sẻ" subscribed: "tất cả" - prefix: "Nhận được do cài đặt thông báo: %{reason}" + prefix: "Đã nhận được do cài đặt thông báo: %{reason}" date_alert_start_date: "Cảnh báo ngày" date_alert_due_date: "Cảnh báo ngày" - reminder: "Reminder" + reminder: "Lời nhắc" see_all: "Xem tất cả" - updated_at: "Cập nhật vào %{timestamp} bởi %{user}" + updated_at: "Cập nhật tại %{timestamp} bởi %{user}" reminder_notifications: - subject: "Reminder: %{note}" - heading: "You have a new reminder" - note: "Note: “%{note}”" + subject: "Nhắc nhở: %{note}" + heading: "Bạn có lời nhắc mới" + note: "Lưu ý: “%{note}”" sharing: work_packages: - allowed_actions: "Bạn có thể %{allowed_actions} gói công việc này. Điều này có thể thay đổi tùy thuộc vào vai trò và quyền hạn của bạn trong dự án." - create_account: "Để truy cập gói công việc này, bạn sẽ cần tạo và kích hoạt tài khoản trên %{instance}." + allowed_actions: "Bạn có thể %{allowed_actions} gói công việc này. Điều này có thể thay đổi tùy thuộc vào vai trò và quyền dự án của bạn." + create_account: "Để truy cập gói công việc này, bạn cần tạo và kích hoạt tài khoản trên %{instance}." open_work_package: "Mở gói công việc" subject: "Gói công việc #%{id} đã được chia sẻ với bạn" - enterprise_text: "Chia sẻ gói công việc với người dùng không phải là thành viên của dự án." + enterprise_text: "Chia sẻ các gói công việc với người dùng không phải là thành viên của dự án." summary: - user: "%{user} đã chia sẻ một gói công việc với bạn với quyền %{role_rights}" - group: "%{user} đã chia sẻ một gói công việc với nhóm %{group} mà bạn là thành viên" + user: "%{user} đã chia sẻ gói công việc với bạn với quyền %{role_rights}" + group: "%{user} đã chia sẻ gói công việc với nhóm %{group} bạn là thành viên của" storages: health: plaintext: storage: "Lưu trữ" healthy: - summary: 'Tin vui! Tình trạng lưu trữ của bạn, %{storage_name}, hiện đang hiển thị là "Khỏe mạnh".' - error-solved-on: "Giải quyết vào" - recommendation: "Chúng tôi sẽ tiếp tục theo dõi hệ thống để đảm bảo nó vẫn trong tình trạng tốt. Trong trường hợp có sự bất thường, chúng tôi sẽ thông báo cho bạn." - details: "Để biết thêm chi tiết hoặc thực hiện các sửa đổi cần thiết, bạn có thể truy cập cấu hình lưu trữ của mình" + summary: 'Tin tốt! Trạng thái bộ nhớ của bạn, %{storage_name}, hiện đang hiển thị là "Ổn".' + error-solved-on: "Đã giải quyết trên" + recommendation: "Chúng tôi sẽ tiếp tục theo dõi hệ thống để đảm bảo hệ thống vẫn hoạt động tốt. Trong trường hợp có bất kỳ sự khác biệt nào, chúng tôi sẽ thông báo cho bạn." + details: "Để biết thêm chi tiết hoặc thực hiện bất kỳ sửa đổi cần thiết nào, bạn có thể truy cập cấu hình bộ nhớ của mình" unhealthy: - summary: 'Tình trạng lưu trữ của bạn, %{storage_name}, hiện đang hiển thị là "Lỗi". Chúng tôi đã phát hiện một vấn đề có thể yêu cầu sự chú ý của bạn.' + summary: 'Trạng thái bộ nhớ của bạn, %{storage_name}, hiện đang hiển thị là "Lỗi". Chúng tôi đã phát hiện một sự cố có thể cần bạn chú ý.' error-details: "Chi tiết lỗi" error-message: "Thông báo lỗi" - error-occurred-on: "Xảy ra vào" - recommendation: "Chúng tôi khuyên bạn nên truy cập trang cấu hình lưu trữ để giải quyết vấn đề này" - unsubscribe: "Nếu bạn không còn muốn nhận các thông báo này, bạn có thể hủy đăng ký bất cứ lúc nào. Để hủy đăng ký, vui lòng làm theo hướng dẫn trên trang này" - email_notification_settings: "Cài đặt thông báo qua email cho lưu trữ" + error-occurred-on: "Đã xảy ra vào ngày" + recommendation: "Chúng tôi khuyên bạn nên truy cập trang cấu hình bộ nhớ để giải quyết vấn đề này" + unsubscribe: "Nếu bạn không muốn nhận những thông báo này nữa, bạn có thể hủy đăng ký bất kỳ lúc nào. Để hủy đăng ký, vui lòng làm theo hướng dẫn trên trang này" + email_notification_settings: "Cài đặt thông báo email lưu trữ" see_storage_settings: "Xem cài đặt lưu trữ" healthy: - subject: 'Lưu trữ "%{name}" hiện đã khỏe mạnh!' - solved_at: "giải quyết vào" - summary: "Vấn đề với tích hợp lưu trữ %{storage_name} của bạn đã được giải quyết" + subject: 'Bộ nhớ "%{name}" hiện đã hoạt động bình thường!' + solved_at: "giải quyết tại" + summary: "Sự cố với việc tích hợp bộ nhớ %{storage_name} của bạn hiện đã được giải quyết" unhealthy: - subject: 'Lưu trữ "%{name}" không khỏe mạnh!' - since: "kể từ" - summary: "Có vấn đề với tích hợp lưu trữ %{storage_name} của bạn" + subject: 'Bộ nhớ "%{name}" không tốt cho sức khỏe!' + since: "kể từ khi" + summary: "Đã xảy ra sự cố với việc tích hợp bộ nhớ %{storage_name} của bạn" troubleshooting: - text: "Để biết thêm thông tin, hãy kiểm tra các lưu trữ tệp" - link_text: "tài liệu xử lý sự cố" - mail_body_account_activation_request: "Một người dùng mới (%{value}) đã đăng ký. Tài khoản đang chờ phê duyệt của bạn:" + text: "Để biết thêm thông tin, hãy kiểm tra kho lưu trữ tệp" + link_text: "tài liệu khắc phục sự cố" + mail_body_account_activation_request: "Một người dùng mới (%{value}) đã đăng ký. Tài khoản đang chờ bạn phê duyệt:" mail_body_account_information: "Thông tin tài khoản của bạn" mail_body_account_information_external: "Bạn có thể sử dụng tài khoản %{value} của mình để đăng nhập." mail_body_backup_ready: "Yêu cầu sao lưu của bạn đã sẵn sàng. Bạn có thể tải về tại đây:" @@ -3737,32 +3801,32 @@ vi: mail_body_backup_token_info: Token trước đó không còn hiệu lực. mail_body_backup_waiting_period: Mã token sao lưu sẽ được kích hoạt trong %{hours} giờ. mail_body_backup_token_warning: Nếu đây không phải là bạn, hãy đăng nhập vào OpenProject ngay lập tức và thiết lập lại lại. - mail_body_incoming_email_error: Email bạn gửi đến OpenProject không thể được xử lý. - mail_body_incoming_email_error_in_reply_to: "Vào %{received_at} %{from_email} đã viết" + mail_body_incoming_email_error: Không thể xử lý email bạn gửi tới OpenProject. + mail_body_incoming_email_error_in_reply_to: "Tại %{received_at} %{from_email} đã viết" mail_body_incoming_email_error_logs: "Nhật ký" mail_body_lost_password: "Để thay đổi mật khẩu của bạn, hãy nhấp vào liên kết sau:" mail_password_change_not_possible: title: "Không thể thay đổi mật khẩu" body: "Tài khoản của bạn tại %{app_title} được kết nối với nhà cung cấp xác thực bên ngoài (%{name})." - subtext: "Mật khẩu cho tài khoản bên ngoài không thể thay đổi trong ứng dụng. Vui lòng sử dụng chức năng quên mật khẩu của nhà cung cấp xác thực của bạn." + subtext: "Mật khẩu cho tài khoản bên ngoài không thể thay đổi trong ứng dụng. Vui lòng sử dụng chức năng mất mật khẩu của nhà cung cấp xác thực của bạn." mail_body_register: "Chào mừng đến với %{app_title}. Vui lòng kích hoạt tài khoản của bạn bằng cách nhấp vào liên kết này:" mail_body_register_header_title: "Email mời thành viên dự án" - mail_body_register_user: "Kính gửi %{name}, " + mail_body_register_user: "Kính gửi %{name}," mail_body_register_links_html: | - Vui lòng cảm thấy tự do truy cập kênh YouTube của chúng tôi (%{youtube_link}), nơi chúng tôi cung cấp một hội thảo trên web (%{webinar_link}) - và các video "Bắt đầu" (%{get_started_link}) để làm cho những bước đầu tiên của bạn trong OpenProject trở nên dễ dàng nhất có thể. + Vui lòng duyệt qua kênh youtube của chúng tôi (%{youtube_link}) nơi chúng tôi cung cấp hội thảo trên web (%{webinar_link}) + và video “Bắt đầu” (%{get_started_link}) để thực hiện các bước đầu tiên của bạn trong OpenProject dễ dàng nhất có thể.
    - Nếu bạn có bất kỳ câu hỏi nào thêm, hãy tham khảo tài liệu của chúng tôi (%{documentation_link}) hoặc liên hệ với quản trị viên của bạn. + Nếu bạn có thêm bất kỳ câu hỏi nào, hãy tham khảo tài liệu của chúng tôi (%{documentation_link}) hoặc liên hệ với quản trị viên của bạn. mail_body_register_closing: "Nhóm OpenProject của bạn" - mail_body_register_ending: "Giữ kết nối! Trân trọng," - mail_body_reminder: "%{count} gói công việc(s) được giao cho bạn sẽ phải hoàn thành trong %{days} ngày tới:" + mail_body_register_ending: "Luôn kết nối! Trân trọng," + mail_body_reminder: "%{count} gói công việc được giao cho bạn sẽ đến hạn trong %{days} ngày tới:" mail_body_group_reminder: '%{count} gói công việc được gán cho nhóm "%{group}" là do %{days} ngày tiếp theo:' - mail_body_wiki_page_added: "Trang wiki '%{id}' đã được %{author} thêm." - mail_body_wiki_page_updated: "Trang wiki '%{id}' đã được %{author} cập nhật." - mail_subject_account_activation_request: "Yêu cầu kích hoạt tài khoản %{value}" + mail_body_wiki_page_added: "Trang wiki '%{id}' đã được thêm bởi %{author}." + mail_body_wiki_page_updated: "Trang wiki '%{id}' đã được cập nhật bởi %{author}." + mail_subject_account_activation_request: "%{value} yêu cầu kích hoạt tài khoản" mail_subject_backup_ready: "Bản sao lưu của bạn đã sẵn sàng" - mail_subject_backup_token_reset: "Đặt lại mã sao lưu" - mail_subject_incoming_email_error: "Email bạn gửi đến OpenProject không thể được xử lý" + mail_subject_backup_token_reset: "Đặt lại mã thông báo dự phòng" + mail_subject_incoming_email_error: "Không thể xử lý email bạn gửi tới OpenProject" mail_subject_lost_password: "Mật khẩu %{value} của bạn" mail_subject_register: "Kích hoạt tài khoản %{value} của bạn" mail_subject_wiki_content_added: "Trang wiki '%{id}' đã được thêm" @@ -3782,97 +3846,97 @@ vi: with_message: "%{user} đã cập nhật các vai trò bạn có trong dự án '%{project}':" roles: "Bây giờ bạn có các vai trò sau:" mail_member_updated_global: - subject: "Quyền toàn cầu của bạn đã được cập nhật" + subject: "Quyền chung của bạn đã được cập nhật" body: updated_by: without_message: "%{user} đã cập nhật các vai trò của bạn trên toàn cầu." - with_message: "%{user} đã cập nhật các vai trò của bạn trên toàn cầu viết:" + with_message: "%{user} đã cập nhật các vai trò mà bạn đảm nhiệm trên toàn cầu:" roles: "Bây giờ bạn có các vai trò sau:" mail_user_activation_limit_reached: - subject: Đã đạt giới hạn kích hoạt người dùng + subject: Đã đạt đến giới hạn kích hoạt người dùng message: | - Một người dùng mới (%{email}) đã cố gắng tạo một tài khoản trên môi trường OpenProject mà bạn quản lý (%{host}). - Người dùng không thể kích hoạt tài khoản của mình vì đã đạt giới hạn người dùng. + Một người dùng mới (%{email}) đã cố gắng tạo tài khoản trên môi trường OpenProject mà bạn quản lý (%{host}). + Người dùng không thể kích hoạt tài khoản của họ vì đã đạt đến giới hạn người dùng. steps: label: "Để cho phép người dùng đăng nhập, bạn có thể:" - a: "Nâng cấp kế hoạch thanh toán của bạn ([tại đây](upgrade_url))" #here turned into a link - b: "Khóa hoặc xóa một người dùng hiện có ([tại đây](users_url))" #here turned into a link - more_actions: "Thêm chức năng" + a: "Nâng cấp gói thanh toán của bạn ([here](upgrade_url))" #here turned into a link + b: "Khóa hoặc xóa người dùng hiện tại ([here](users_url))" #here turned into a link + more_actions: "Nhiều chức năng hơn" noscript_description: "Bạn cần kích hoạt JavaScript để sử dụng OpenProject!" - noscript_heading: "JavaScript bị tắt" + noscript_heading: "Đã tắt JavaScript" noscript_learn_more: "Tìm hiểu thêm" notice_accessibility_mode: Chế độ tiếp cận có thể được kích hoạt trong [tài khoản settings](url) của bạn. - notice_account_activated: "Tài khoản của bạn đã được kích hoạt. Bạn có thể đăng nhập ngay bây giờ." - notice_account_already_activated: Tài khoản đã được kích hoạt rồi. - notice_account_invalid_token: Mã kích hoạt không hợp lệ + notice_account_activated: "Tài khoản của bạn đã được kích hoạt. Bây giờ bạn có thể đăng nhập." + notice_account_already_activated: Tài khoản đã được kích hoạt. + notice_account_invalid_token: Mã thông báo kích hoạt không hợp lệ notice_account_invalid_credentials: "Tài khoản hoặc mật mã không hợp lệ" - notice_account_invalid_credentials_or_blocked: "Tên người dùng hoặc mật khẩu không hợp lệ hoặc tài khoản bị khóa do nhiều lần đăng nhập không thành công. Nếu vậy, tài khoản sẽ được mở khóa tự động trong thời gian ngắn." - notice_account_lost_email_sent: "Một email với hướng dẫn chọn mật khẩu mới đã được gửi đến bạn." - notice_account_new_password_forced: "Cần một mật khẩu mới." - notice_account_password_expired: "Mật khẩu của bạn đã hết hạn sau %{days} ngày. Vui lòng đặt mật khẩu mới." + notice_account_invalid_credentials_or_blocked: "Người dùng hoặc mật khẩu không hợp lệ hoặc tài khoản bị chặn do đăng nhập nhiều lần không thành công. Nếu vậy, nó sẽ tự động được bỏ chặn trong thời gian ngắn." + notice_account_lost_email_sent: "Một email có hướng dẫn chọn mật khẩu mới đã được gửi cho bạn." + notice_account_new_password_forced: "Cần phải có mật khẩu mới." + notice_account_password_expired: "Mật khẩu của bạn đã hết hạn sau %{days} ngày. Vui lòng đặt một cái mới." notice_account_password_updated: "Mật khẩu đã được cập nhật thành công." - notice_account_pending: "Tài khoản của bạn đã được tạo và hiện đang chờ phê duyệt của quản trị viên." - notice_account_register_done: "Tài khoản đã được tạo thành công. Để kích hoạt tài khoản của bạn, hãy nhấp vào liên kết đã được gửi qua email cho bạn." + notice_account_pending: "Tài khoản của bạn đã được tạo và hiện đang chờ quản trị viên phê duyệt." + notice_account_register_done: "Tài khoản đã được tạo thành công. Để kích hoạt tài khoản của bạn, hãy nhấp vào liên kết được gửi qua email cho bạn." notice_account_unknown_email: "Người dùng không xác định." notice_account_update_failed: "Không thể lưu thiết đặt tài khoản. Xin vui lòng kiểm tra trong trang tài khoản của bạn." notice_account_updated: "Tài khoản đã được cập nhật thành công." notice_account_other_session_expired: "Tất cả phiên giao dịch khác của tài khoản này đã bị vô hiệu." notice_account_wrong_password: "Mật khẩu sai" - notice_account_registered_and_logged_in: "Chào mừng, tài khoản của bạn đã được kích hoạt. Bạn đã đăng nhập thành công." + notice_account_registered_and_logged_in: "Chào mừng, tài khoản của bạn đã được kích hoạt. Bạn đã đăng nhập bây giờ." notice_activation_failed: Tài khoản không thể được kích hoạt. notice_auth_stage_verification_error: "Không thể xác nhận giai đoạn '%{stage}'." notice_auth_stage_wrong_stage: "Dự kiến sẽ kết thúc giai đoạn xác thực '%{expected}', nhưng '%{actual}' quay lại." notice_auth_stage_error: "Xác thực giai đoạn '%{stage}' không thành công." notice_can_t_change_password: "Tài khoản này sử dụng nguồn xác thực bên ngoài. Không thể thay đổi mật khẩu." - notice_custom_options_deleted: "Tùy chọn '%{option_value}' và %{num_deleted} trường hợp của nó đã được xóa." - notice_email_error: "Đã xảy ra lỗi khi gửi email (%{value})" - notice_email_sent: "Một email đã được gửi đến %{value}" - notice_failed_to_save_work_packages: "Không lưu được %{count} gói công việc(s) trên %{total} đã chọn: %{ids}." - notice_failed_to_save_members: "Không thể lưu thành viên(s): %{errors}." + notice_custom_options_deleted: "Tùy chọn '%{option_value}' và các lần xuất hiện %{num_deleted} của nó đã bị xóa." + notice_email_error: "Đã xảy ra lỗi khi gửi thư (%{value})" + notice_email_sent: "Một email đã được gửi tới %{value}" + notice_failed_to_save_work_packages: "Không lưu được %{count} gói công việc trên %{total} đã chọn: %{ids}." + notice_failed_to_save_members: "Không lưu được thành viên: %{errors}." notice_deletion_scheduled: "Việc xóa đã được lên lịch và được thực hiện không đồng bộ." - notice_file_not_found: "Trang bạn đang cố gắng truy cập không tồn tại hoặc đã bị xóa." - notice_forced_logout: "Bạn đã bị đăng xuất tự động sau %{ttl_time} phút không hoạt động." - notice_internal_server_error: "Đã xảy ra lỗi trên trang bạn đang cố gắng truy cập. Nếu bạn tiếp tục gặp vấn đề, vui lòng liên hệ với quản trị viên %{app_title} của bạn để được trợ giúp." - notice_locking_conflict: "Thông tin đã được cập nhật bởi ít nhất một người dùng khác trong thời gian đó." - notice_locking_conflict_additional_information: "Bản cập nhật(s) này đến từ %{users}." - notice_locking_conflict_reload_page: "Vui lòng tải lại trang, xem xét các thay đổi và áp dụng lại các cập nhật của bạn." - notice_locking_conflict_warning: "This page has been updated by someone else. To not lose your edits, copy them locally and reload to view the updated version." - notice_locking_conflict_danger: "Could not save your changes because of conflicting modifications. To not lose your edits, copy them locally and reload to view the updated version." - notice_locking_conflict_action_button: "Discard changes and reload" + notice_file_not_found: "Trang bạn đang cố truy cập không tồn tại hoặc đã bị xóa." + notice_forced_logout: "Bạn đã tự động đăng xuất sau %{ttl_time} phút không hoạt động." + notice_internal_server_error: "Đã xảy ra lỗi trên trang bạn đang cố truy cập. Nếu bạn tiếp tục gặp sự cố, vui lòng liên hệ với quản trị viên %{app_title} của bạn để được hỗ trợ." + notice_locking_conflict: "Thông tin đã được cập nhật bởi ít nhất một người dùng khác trong thời gian chờ đợi." + notice_locking_conflict_additional_information: "(Các) bản cập nhật đến từ %{users}." + notice_locking_conflict_reload_page: "Vui lòng tải lại trang, xem lại các thay đổi và áp dụng lại các cập nhật của bạn." + notice_locking_conflict_warning: "Trang này đã được cập nhật bởi người khác. Để không bị mất các chỉnh sửa của bạn, hãy sao chép chúng trên máy và tải lại để xem phiên bản cập nhật." + notice_locking_conflict_danger: "Không thể lưu các thay đổi của bạn do các sửa đổi xung đột. Để không bị mất các chỉnh sửa của bạn, hãy sao chép chúng trên máy và tải lại để xem phiên bản cập nhật." + notice_locking_conflict_action_button: "Hủy bỏ các thay đổi và tải lại" notice_member_added: Đã thêm %{name} vào dự án. - notice_members_added: Đã thêm %{number} người dùng vào dự án. + notice_members_added: Đã thêm người dùng %{number} vào dự án. notice_member_removed: "Đã xóa %{user} khỏi dự án." notice_member_deleted: "%{user} đã bị xóa khỏi dự án và bị xóa." - notice_no_principals_found: "Không tìm thấy kết quả." - notice_bad_request: "Yêu cầu không hợp lệ." + notice_no_principals_found: "Không tìm thấy kết quả nào." + notice_bad_request: "Yêu cầu xấu." notice_not_authorized: "Bạn không được phép truy cập trang này." - notice_not_authorized_archived_project: "Dự án bạn đang cố gắng truy cập đã bị lưu trữ." - notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Mật khẩu của bạn không chính xác. Không thể tiếp tục." - notice_principals_found_multiple: "Có %{number} kết quả được tìm thấy. \n Nhấn Tab để tập trung vào kết quả đầu tiên." - notice_principals_found_single: "Có một kết quả. \n Nhấn Tab để tập trung vào nó." - notice_parent_item_not_found: "Parent item not found." + notice_not_authorized_archived_project: "Dự án bạn đang cố truy cập đã được lưu trữ." + notice_requires_enterprise_token: "Mã thông báo doanh nghiệp bị thiếu hoặc không cho phép truy cập vào trang này." + notice_password_confirmation_failed: "Mật khẩu đã nhập không chính xác." + notice_principals_found_multiple: "Có %{number} kết quả được tìm thấy. \n Tab để tập trung vào kết quả đầu tiên." + notice_principals_found_single: "Có một kết quả. \n Tab để tập trung vào nó." + notice_parent_item_not_found: "Không tìm thấy mục gốc." notice_project_not_deleted: "Dự án không bị xóa." - notice_project_not_found: "Không tìm thấy dự án." + notice_project_not_found: "Dự án không được tìm thấy." notice_successful_connection: "Kết nối thành công." - notice_successful_create: "Tạo thành công." + notice_successful_create: "Sáng tạo thành công." notice_successful_delete: "Xóa thành công." - notice_successful_cancel: "Successful cancellation." + notice_successful_cancel: "Hủy thành công." notice_successful_update: "Cập nhật thành công." - notice_unsuccessful_create: "Creation failed." - notice_unsuccessful_create_with_reason: "Creation failed: %{reason}" - notice_unsuccessful_update: "Update failed." - notice_unsuccessful_update_with_reason: "Update failed: %{reason}" + notice_unsuccessful_create: "Tạo không thành công." + notice_unsuccessful_create_with_reason: "Tạo không thành công: %{reason}" + notice_unsuccessful_update: "Cập nhật không thành công." + notice_unsuccessful_update_with_reason: "Cập nhật không thành công: %{reason}" notice_successful_update_custom_fields_added_to_project: | Cập nhật thành công. Các trường tùy chỉnh của các loại đã kích hoạt sẽ tự động được kích hoạt trên biểu mẫu gói công việc. Xem thêm. - notice_to_many_principals_to_display: "Có quá nhiều kết quả.\nThu hẹp tìm kiếm bằng cách gõ tên của thành viên (hoặc nhóm) mới." - notice_user_missing_authentication_method: Người dùng chưa chọn mật khẩu hoặc phương thức đăng nhập khác. - notice_user_invitation_resent: Một lời mời đã được gửi đến %{email}. - present_access_key_value: "Mã truy cập của bạn %{key_name} là: %{value}" + notice_to_many_principals_to_display: "Có quá nhiều kết quả.\nThu hẹp tìm kiếm bằng cách nhập tên của thành viên (hoặc nhóm) mới." + notice_user_missing_authentication_method: Người dùng vẫn chưa chọn mật khẩu hoặc cách khác để đăng nhập. + notice_user_invitation_resent: Lời mời đã được gửi tới %{email}. + present_access_key_value: "%{key_name} của bạn là: %{value}" notice_automatic_set_of_standard_type: "Đặt loại tiêu chuẩn tự động." - notice_logged_out: "Bạn đã được đăng xuất." - notice_wont_delete_auth_source: Kết nối LDAP không thể bị xóa miễn là vẫn có người dùng đang sử dụng nó. + notice_logged_out: "Bạn đã đăng xuất." + notice_wont_delete_auth_source: Không thể xóa kết nối LDAP miễn là vẫn còn người dùng sử dụng nó. notice_project_cannot_update_custom_fields: "Bạn không thể cập nhật các mục tùy chỉnh có sẵn của dự án. Dự án không hợp lệ: %{errors}" notice_attachment_migration_wiki_page: > Trang này được tạo ra tự động trong quá trình Cập Nhật của OpenProject. Nó chứa tất cả các tập tin đính kèm trước đó liên kết với %{container_type} "%{container_name}". @@ -3890,345 +3954,354 @@ vi: format: "%n %u" units: byte: - other: "Bytes" + other: "Byte" gb: "GB" kb: "kB" mb: "MB" - tb: "TB" + tb: "bệnh lao" onboarding: - heading_getting_started: "Có cái nhìn tổng quan" - text_getting_started_description: "Nhận cái nhìn tổng quan nhanh về quản lý dự án và cộng tác nhóm với OpenProject. Bạn có thể khởi động lại video này từ menu trợ giúp." + heading_getting_started: "Nhận một cái nhìn tổng quan" + text_getting_started_description: "Nhận tổng quan nhanh về quản lý dự án và cộng tác nhóm với OpenProject. Bạn có thể khởi động lại video này từ menu trợ giúp." welcome: "Chào mừng đến với %{app_title}" select_language: "Vui lòng chọn ngôn ngữ của bạn" - permission_add_work_package_comments: "Add comments" + permission_add_work_package_comments: "Thêm nhận xét" permission_add_work_packages: "Thêm mới Gói công việc" permission_add_messages: "Đăng tin nhắn" permission_add_project: "Tạo dự án" - permission_add_portfolios: "Create portfolios" - permission_add_programs: "Create programs" + permission_add_portfolios: "Tạo danh mục đầu tư" + permission_add_programs: "Tạo chương trình" permission_add_work_package_attachments: "Tệp đính kèm" - permission_add_work_package_attachments_explanation: "Cho phép thêm tệp đính kèm mà không cần quyền chỉnh sửa gói công việc" - permission_add_internal_comments: "Write internal comments" + permission_add_work_package_attachments_explanation: "Cho phép thêm tệp đính kèm mà không có quyền Chỉnh sửa gói công việc" + permission_add_internal_comments: "Viết bình luận nội bộ" permission_archive_project: "Lưu trữ dự án" permission_create_user: "Tạo người dùng" permission_manage_user: "Chỉnh sửa người dùng" - permission_manage_placeholder_user: "Tạo, chỉnh sửa và xóa người dùng giả lập" + permission_manage_placeholder_user: "Tạo, chỉnh sửa và xóa người dùng giữ chỗ" permission_add_subprojects: "Tạo Dự án con" permission_add_work_package_watchers: "Thêm người theo dõi" - permission_assign_versions: "Gán phiên bản" - permission_browse_repository: "Quyền truy cập chỉ đọc vào kho (duyệt và kiểm tra)" + permission_assign_versions: "Chỉ định phiên bản" + permission_browse_repository: "Quyền truy cập chỉ đọc vào kho lưu trữ (duyệt và kiểm tra)" permission_change_wiki_parent_page: "Thay đổi trang wiki cha" permission_change_work_package_status: "Thay đổi trạng thái gói công việc" - permission_change_work_package_status_explanation: "Cho phép thay đổi trạng thái mà không cần quyền chỉnh sửa gói công việc" + permission_change_work_package_status_explanation: "Cho phép thay đổi trạng thái mà không có quyền Chỉnh sửa gói công việc" permission_comment_news: "Chú thích vào tin mới" - permission_commit_access: "Quyền đọc/ghi vào kho (cam kết)" + permission_commit_access: "Quyền truy cập đọc/ghi vào kho lưu trữ (cam kết)" permission_copy_projects: "Sao chép dự án" - permission_copy_projects_explanation: "In template projects, this permission has a secondary function, it allows the creation of new projects derived from the template." - permission_copy_work_packages: "Duplicate work packages" + permission_copy_projects_explanation: "Trong các dự án mẫu, quyền này có chức năng phụ, nó cho phép tạo các dự án mới bắt nguồn từ mẫu." + permission_copy_work_packages: "Gói công việc trùng lặp" permission_create_backup: "Tạo bản sao lưu" permission_delete_work_package_watchers: "Xóa người xem" permission_delete_work_packages: "Xóa gói công việc" permission_delete_messages: "Xóa tin nhắn" permission_delete_own_messages: "Xóa tin nhắn của tôi" permission_delete_reportings: "Xóa các báo cáo" - permission_delete_timelines: "Xóa mốc thời gian" - permission_delete_wiki_pages: "Xóa trang wiki" + permission_delete_timelines: "Xóa dòng thời gian" + permission_delete_wiki_pages: "Xóa các trang wiki" permission_delete_wiki_pages_attachments: "Xóa tệp đính kèm" - permission_edit_work_package_comments: "Moderate comments" - permission_edit_work_package_comments_explanation: "Caution: Users with this permission are able to edit anyone's comment." + permission_edit_work_package_comments: "Kiểm duyệt bình luận" + permission_edit_work_package_comments_explanation: "Thận trọng: Người dùng có quyền này có thể chỉnh sửa nhận xét của bất kỳ ai." permission_edit_work_packages: "Chỉnh sửa gói công việc" permission_edit_messages: "Chỉnh sửa tin nhắn" - permission_edit_own_internal_comments: "Edit own internal comments" - permission_edit_own_work_package_comments: "Edit own comments" - permission_edit_own_messages: "Chỉnh sửa tin nhắn của riêng bạn" + permission_edit_own_internal_comments: "Chỉnh sửa nhận xét nội bộ của riêng mình" + permission_edit_own_work_package_comments: "Chỉnh sửa nhận xét của chính mình" + permission_edit_own_messages: "Chỉnh sửa tin nhắn riêng" permission_edit_own_time_entries: "Chỉnh sửa nhật ký thời gian của riêng bạn" - permission_edit_others_internal_comments: "Moderate internal comments" - permission_edit_others_internal_comments_explanation: "Caution: Users with this permission are able to edit other users' internal comments." + permission_edit_others_internal_comments: "Bình luận nội bộ vừa phải" + permission_edit_others_internal_comments_explanation: "Thận trọng: Người dùng có quyền này có thể chỉnh sửa nhận xét nội bộ của người dùng khác." permission_edit_project: "Chỉnh sửa dự án" permission_edit_project_attributes: "Chỉnh sửa thuộc tính dự án" - permission_edit_project_phases: "Edit project phases" + permission_edit_project_phases: "Chỉnh sửa các giai đoạn dự án" permission_edit_reportings: "Chỉnh sửa báo cáo" - permission_edit_time_entries: "Chỉnh sửa nhật ký thời gian của người khác" - permission_edit_timelines: "Chỉnh sửa mốc thời gian" + permission_edit_time_entries: "Chỉnh sửa nhật ký thời gian cho người dùng khác" + permission_edit_timelines: "Chỉnh sửa dòng thời gian" permission_edit_wiki_pages: "Chỉnh sửa trang wiki" permission_export_work_packages: "Xuất gói công việc" - permission_export_projects: "Export projects" + permission_export_projects: "Dự án xuất khẩu" permission_export_wiki_pages: "Xuất trang wiki" - permission_invite_members_by_email: "Invite members by email" + permission_invite_members_by_email: "Mời thành viên qua email" permission_invite_members_by_email_explanation: > - Allows users to invite new members by email. Invited users will receive an email with a link to set their password and activate their account. Depends on the permission to manage members + Cho phép người dùng mời thành viên mới qua email. Người dùng được mời sẽ nhận được email có liên kết để đặt mật khẩu và kích hoạt tài khoản của họ. Phụ thuộc vào quyền quản lý thành viên permission_list_attachments: "Liệt kê tệp đính kèm" - permission_log_own_time: "Ghi nhật ký thời gian của riêng bạn" - permission_log_time: "Ghi nhật ký thời gian cho người khác" + permission_log_own_time: "Đăng nhập thời gian riêng" + permission_log_time: "Đăng nhập thời gian cho người dùng khác" permission_manage_forums: "Quản lý diễn đàn" permission_manage_categories: "Quản lý danh mục gói công việc" - permission_manage_dashboards: "Quản lý bảng điều khiển" - permission_manage_work_package_relations: "Quản lý mối quan hệ gói công việc" + permission_manage_dashboards: "Quản lý trang tổng quan" + permission_manage_work_package_relations: "Quản lý quan hệ gói công việc" permission_manage_members: "Quản lý thành viên" permission_manage_news: "Quản lý tin tức" permission_manage_project_activities: "Quản lý hoạt động dự án" permission_manage_public_queries: "Quản lý truy vấn công cộng" - permission_manage_repository: "Quản lý kho" + permission_manage_repository: "Quản lý kho lưu trữ" permission_manage_subtasks: "Quản lý phân cấp gói công việc" permission_manage_versions: "Quản lý phiên bản" permission_manage_wiki: "Quản lý wiki" permission_manage_wiki_menu: "Quản lý menu wiki" permission_move_work_packages: "Di chuyển gói công việc" - permission_protect_wiki_pages: "Bảo vệ trang wiki" - permission_rename_wiki_pages: "Đổi tên trang wiki" + permission_protect_wiki_pages: "Bảo vệ các trang wiki" + permission_rename_wiki_pages: "Đổi tên các trang wiki" permission_save_queries: "Lưu các chế độ xem" permission_search_project: "Tìm kiếm dự án" permission_select_custom_fields: "Chọn trường tùy chỉnh" permission_select_project_custom_fields: "Chọn thuộc tính dự án" - permission_select_project_phases: "Select project phases" - permission_select_project_phases_explanation: "Activate/Deactivate the phases in a project. Enables the user to select the life cycle appropriate for the project as inactive phases will not be visible in the project overview page nor the project list." - permission_select_project_modules: "Chọn các mô-đun dự án" + permission_select_project_phases: "Chọn giai đoạn dự án" + permission_select_project_phases_explanation: "Kích hoạt/hủy kích hoạt các giai đoạn trong dự án. Cho phép người dùng chọn vòng đời phù hợp cho dự án vì các giai đoạn không hoạt động sẽ không hiển thị trên trang tổng quan dự án cũng như danh sách dự án." + permission_select_project_modules: "Chọn mô-đun dự án" permission_share_work_packages: "Chia sẻ gói công việc" permission_manage_types: "Chọn loại" - permission_manage_own_reminders: "Create own reminders" - permission_view_all_principals: "View all users and groups" + permission_manage_own_reminders: "Tạo lời nhắc riêng" + permission_view_all_principals: "Xem tất cả người dùng và nhóm" permission_view_all_principals_explanation: > - Allows users to see all users and groups in the system, even if they are not members of any joined projects or groups. + Cho phép người dùng xem tất cả người dùng và nhóm trong hệ thống, ngay cả khi họ không phải là thành viên của bất kỳ dự án hoặc nhóm nào đã tham gia. permission_view_project: "Xem dự án" - permission_view_changesets: "Xem các sửa đổi kho trong OpenProject" - permission_view_internal_comments: "View internal comments" - permission_view_commit_author_statistics: "Xem thống kê tác giả cam kết" - permission_view_dashboards: "Xem bảng điều khiển" + permission_view_changesets: "Xem các bản sửa đổi kho lưu trữ trong OpenProject" + permission_view_internal_comments: "Xem bình luận nội bộ" + permission_view_commit_author_statistics: "Xem số liệu thống kê về tác giả cam kết" + permission_view_dashboards: "Xem trang tổng quan" permission_view_work_package_watchers: "Xem danh sách người theo dõi" - permission_view_work_packages: "Xem gói công việc" + permission_view_work_packages: "Xem các gói công việc" permission_view_messages: "Xem tin nhắn" permission_view_news: "Xem tin tức" permission_view_members: "Xem thành viên" permission_view_reportings: "Xem báo cáo" permission_view_shared_work_packages: "Xem chia sẻ gói công việc" - permission_view_time_entries: "Xem thời gian đã chi tiêu" - permission_view_timelines: "Xem mốc thời gian" - permission_view_user_email: "View users' mail addresses" - permission_view_wiki_edits: "Xem lịch sử chỉnh sửa wiki" + permission_view_time_entries: "Xem thời gian đã sử dụng" + permission_view_timelines: "Xem dòng thời gian" + permission_view_user_email: "Xem địa chỉ thư của người dùng" + permission_view_wiki_edits: "Xem lịch sử wiki" permission_view_wiki_pages: "Xem wiki" - permission_work_package_assigned: "Trở thành người được chỉ định/chịu trách nhiệm" - permission_work_package_assigned_explanation: "Gói công việc có thể được gán cho người dùng và nhóm sở hữu vai trò này trong dự án tương ứng" + permission_work_package_assigned: "Trở thành người được giao/chịu trách nhiệm" + permission_work_package_assigned_explanation: "Các gói công việc có thể được chỉ định cho người dùng và nhóm có vai trò này trong dự án tương ứng" permission_view_project_activity: "Xem hoạt động dự án" permission_view_project_attributes: "Xem thuộc tính dự án" - permission_view_project_phases: "View project phases" - permission_save_bcf_queries: "Lưu các truy vấn BCF" - permission_manage_public_bcf_queries: "Quản lý các truy vấn BCF công khai" + permission_view_project_phases: "Xem các giai đoạn dự án" + permission_save_bcf_queries: "Lưu truy vấn BCF" + permission_manage_public_bcf_queries: "Quản lý truy vấn BCF công khai" permission_edit_attribute_help_texts: "Chỉnh sửa văn bản trợ giúp thuộc tính" - permission_manage_public_project_queries: "Quản lý danh sách dự án công khai" + permission_manage_public_project_queries: "Quản lý danh sách dự án công" permission_view_project_query: "Xem truy vấn dự án" permission_edit_project_query: "Chỉnh sửa truy vấn dự án" placeholders: default: "-" portfolio: count: - zero: "0 portfolios" - one: "1 portfolio" - other: "%{count} portfolios" + zero: "0 danh mục đầu tư" + one: "1 danh mục đầu tư" + other: "%{count} danh mục đầu tư" program: count: - zero: "0 programs" - one: "1 program" - other: "%{count} programs" + zero: "0 chương trình" + one: "1 chương trình" + other: "%{count} chương trình" project: archive: - title: "Archive project" + title: "Lưu trữ dự án" are_you_sure: "Bạn có chắc bạn muốn lưu trữ các dự án '%{name}'?" archived: "Đã lưu" count: - zero: "0 projects" - one: "một dự án" + zero: "0 dự án" + one: "1 dự án" other: "%{count} dự án" destroy: title: "Xóa dự án" - heading: "Permanently delete this project?" + heading: "Xóa vĩnh viễn dự án này?" confirmation_message_for_subprojects_html: zero: > - You are about to permanently delete all data relating to project %{name}. + Bạn sắp xóa vĩnh viễn tất cả dữ liệu liên quan đến dự án %{name}. one: > - You are about to permanently delete all data relating to project %{name} and this subproject: + Bạn sắp xóa vĩnh viễn tất cả dữ liệu liên quan đến dự án %{name} và tiểu dự án này: other: > - You are about to permanently delete all data relating to project %{name} and these subprojects: + Bạn sắp xóa vĩnh viễn tất cả dữ liệu liên quan đến dự án %{name} và các dự án con này: filters: - project_phase: "Project phase: %{phase}" - project_phase_any: "Project phase: Any" - project_phase_gate: "Project phase gate: %{gate}" + project_phase: "Giai đoạn dự án: %{phase}" + project_phase_any: "Giai đoạn dự án: Bất kỳ" + project_phase_gate: "Cổng giai đoạn dự án: %{gate}" identifier: - warning_one: Các thành viên của dự án sẽ phải di chuyển các kho của dự án. + warning_one: Các thành viên của dự án sẽ phải di dời các kho của dự án. warning_two: Các liên kết hiện có tới dự án sẽ không còn hoạt động. title: Thay đổi mã định danh của dự án - not_available: "Project N/A" + not_available: "Dự án N/A" template: - copying_title: "Applying template" + copying_title: "Áp dụng mẫu" copying: > - Dự án của bạn đang được tạo từ dự án mẫu đã chọn. Bạn sẽ nhận được thông báo qua email ngay khi dự án có sẵn. + Dự án của bạn đang được tạo từ dự án mẫu đã chọn. Bạn sẽ được thông báo qua thư ngay khi dự án có sẵn. use_template: "Sử dụng mẫu" - make_template: "Đặt thành mẫu" + make_template: "Đặt làm mẫu" remove_from_templates: "Xóa khỏi mẫu" - project_module_activity: "Hoạt động" - project_module_forums: "Diễn đàn" + project_module_activity: "hoạt động" + project_module_forums: "diễn đàn" project_module_work_package_tracking: "Work Packages" - project_module_news: "Tin tức" - project_module_repository: "Kho lưu trữ" - project_module_wiki: "Wiki" + project_module_news: "tin tức" + project_module_repository: "kho lưu trữ" + project_module_wiki: "wiki" permission_header_for_project_module_work_package_tracking: "Gói công việc và biểu đồ Gantt" query: attribute_and_direction: "%{attribute} (%{direction})" #possible query parameters (e.g. issue queries), #which are not attributes of an AR-Model. query_fields: - active_or_archived: "Hoạt động hoặc đã lưu trữ" - assigned_to_role: "Vai trò của người được chỉ định" + active_or_archived: "Đang hoạt động hoặc được lưu trữ" + assigned_to_role: "Vai trò của người được ủy quyền" assignee_or_group: "Người chuyển hoặc thuộc nhóm" - member_of_group: "Nhóm của người được chỉ định" + member_of_group: "Nhóm người được ủy quyền" name_or_identifier: "Tên hoặc mã định danh" - only_subproject_id: "Chỉ dự án con" - shared_with_user: "Chia sẻ với người dùng" - shared_with_me: "Chia sẻ với tôi" - subproject_id: "Bao gồm dự án con" + only_subproject_id: "Chỉ có tiểu dự án" + shared_with_user: "Được chia sẻ với người dùng" + shared_with_me: "Đã chia sẻ với tôi" + subproject_id: "Bao gồm tiểu dự án" repositories: at_identifier: "tại %{identifier}" - atom_revision_feed: "Dòng thời gian phiên bản Atom" - autofetch_information: "Chọn tùy chọn này nếu bạn muốn các kho được cập nhật tự động khi truy cập trang mô-đun kho.\nĐiều này bao gồm việc lấy các cam kết từ kho và làm mới dung lượng đĩa cần thiết." + atom_revision_feed: "Nguồn cấp dữ liệu sửa đổi Atom" + autofetch_information: "Chọn tùy chọn này nếu bạn muốn các kho lưu trữ được cập nhật tự động khi truy cập trang mô-đun kho lưu trữ.\nĐiều này bao gồm việc truy xuất các cam kết từ kho lưu trữ và làm mới bộ nhớ đĩa cần thiết." checkout: access: - readwrite: "Đọc + Ghi" + readwrite: "Đọc + Viết" read: "Chỉ đọc" - none: "Không có quyền truy cập, bạn chỉ có thể xem kho qua ứng dụng này." - access_permission: "Quyền của bạn trên kho này" - url: "URL để kiểm tra" - base_url_text: "URL cơ bản để sử dụng khi tạo URL kiểm tra (ví dụ: https://myserver.example.org/repos/).\nLưu ý: URL cơ bản chỉ được sử dụng để viết lại các URL kiểm tra trong các kho được quản lý. Các kho khác không bị thay đổi." + none: "Không có quyền truy cập thanh toán, bạn chỉ có thể xem kho lưu trữ thông qua ứng dụng này." + access_permission: "Quyền của bạn đối với kho lưu trữ này" + url: "URL thanh toán" + base_url_text: "URL cơ sở dùng để tạo URL thanh toán (ví dụ: https://myserver.example.org/repos/).\nLưu ý: URL cơ sở chỉ được sử dụng để viết lại URL thanh toán trong kho được quản lý. Các kho lưu trữ khác không bị thay đổi." default_instructions: git: |- - Dữ liệu trong kho này có thể được tải xuống máy tính của bạn bằng Git. - Vui lòng tham khảo tài liệu của Git nếu bạn cần thêm thông tin về quy trình kiểm tra và các khách hàng có sẵn. + Dữ liệu chứa trong kho lưu trữ này có thể được tải xuống máy tính của bạn bằng Git. + Vui lòng tham khảo tài liệu của Git nếu bạn cần thêm thông tin về quy trình thanh toán và các khách hàng hiện có. subversion: |- - Dữ liệu trong kho này có thể được tải xuống máy tính của bạn bằng Subversion. - Vui lòng tham khảo tài liệu của Subversion nếu bạn cần thêm thông tin về quy trình kiểm tra và các khách hàng có sẵn. - enable_instructions_text: "Hiển thị hướng dẫn kiểm tra được định nghĩa dưới đây trên tất cả các trang liên quan đến kho." - instructions: "Hướng dẫn kiểm tra" - show_instructions: "Hiển thị hướng dẫn kiểm tra" - text_instructions: "Văn bản này được hiển thị cùng với URL kiểm tra để hướng dẫn cách kiểm tra kho." - not_available: "Hướng dẫn kiểm tra không được định nghĩa cho kho này. Hãy yêu cầu quản trị viên của bạn bật chúng cho kho này trong cài đặt hệ thống." - create_managed_delay: "Xin lưu ý: Kho được quản lý, nó được tạo một cách bất đồng bộ trên đĩa và sẽ sớm có sẵn." - create_successful: "Kho đã được đăng ký." + Dữ liệu chứa trong kho lưu trữ này có thể được tải xuống máy tính của bạn bằng Subversion. + Vui lòng tham khảo tài liệu của Subversion nếu bạn cần thêm thông tin về quy trình thanh toán và các khách hàng hiện có. + enable_instructions_text: "Hiển thị hướng dẫn thanh toán được xác định bên dưới trên tất cả các trang liên quan đến kho lưu trữ." + instructions: "Hướng dẫn thanh toán" + show_instructions: "Hiển thị hướng dẫn thanh toán" + text_instructions: "Văn bản này được hiển thị cùng với URL thanh toán để được hướng dẫn cách kiểm tra kho lưu trữ." + not_available: "Hướng dẫn thanh toán không được xác định cho kho lưu trữ này. Hãy yêu cầu quản trị viên của bạn kích hoạt chúng cho kho lưu trữ này trong cài đặt hệ thống." + create_managed_delay: "Xin lưu ý: Kho lưu trữ được quản lý, nó được tạo không đồng bộ trên đĩa và sẽ sớm ra mắt." + create_successful: "Kho lưu trữ đã được đăng ký." delete_sucessful: "Kho lưu trữ đã bị xóa." destroy: - confirmation: "Nếu bạn tiếp tục, điều này sẽ xóa vĩnh viễn kho được quản lý." - info: "Việc xóa kho là hành động không thể khôi phục." - info_not_managed: "Lưu ý: Điều này KHÔNG xóa nội dung của kho này, vì nó không được quản lý bởi OpenProject." + confirmation: "Nếu bạn tiếp tục, thao tác này sẽ xóa vĩnh viễn kho lưu trữ được quản lý." + info: "Xóa kho lưu trữ là một hành động không thể đảo ngược." + info_not_managed: "Lưu ý: Thao tác này sẽ KHÔNG xóa nội dung của kho lưu trữ này vì nó không được OpenProject quản lý." managed_path_note: "Thư mục sau sẽ bị xóa: %{path}" - repository_verification: "Nhập mã định danh của dự án %{identifier} để xác minh việc xóa kho của nó." + repository_verification: "Nhập mã định danh của dự án %{identifier} để xác minh việc xóa kho lưu trữ của dự án." subtitle: "Bạn có thực sự muốn xóa %{repository_type} của dự án %{project_name} không?" - subtitle_not_managed: "Bạn có thực sự muốn xóa %{repository_type} liên kết %{url} khỏi dự án %{project_name} không?" + subtitle_not_managed: "Bạn có thực sự muốn xóa %{repository_type} %{url} được liên kết khỏi dự án %{project_name} không?" title: "Xóa %{repository_type}" - title_not_managed: "Xóa %{repository_type} liên kết?" + title_not_managed: "Xóa %{repository_type} được liên kết?" errors: - build_failed: "Không thể tạo kho với cấu hình đã chọn. %{reason}" - managed_delete: "Không thể xóa kho được quản lý." - managed_delete_local: "Không thể xóa kho cục bộ trên hệ thống tập tin tại '%{path}': %{error_message}" - empty_repository: "Kho tồn tại nhưng trống rỗng. Nó chưa chứa bất kỳ phiên bản nào." - exists_on_filesystem: "Thư mục kho đã tồn tại trên hệ thống tập tin." - filesystem_access_failed: "Đã xảy ra lỗi khi truy cập kho trên hệ thống tập tin: %{message}" - not_manageable: "Nhà cung cấp kho này không thể được quản lý bởi OpenProject." - path_permission_failed: "Đã xảy ra lỗi khi cố gắng tạo đường dẫn sau: %{path}. Vui lòng đảm bảo rằng OpenProject có thể ghi vào thư mục đó." - unauthorized: "Bạn không được phép truy cập kho hoặc thông tin xác thực không hợp lệ." - unavailable: "Kho không khả dụng." - exception_title: "Không thể truy cập kho: %{message}" - disabled_or_unknown_type: "Loại đã chọn %{type} bị tắt hoặc không còn khả dụng cho nhà cung cấp SCM %{vendor}." - disabled_or_unknown_vendor: "Nhà cung cấp SCM %{vendor} bị tắt hoặc không còn khả dụng." - remote_call_failed: "Gọi đến remote được quản lý thất bại với thông điệp '%{message}' (Mã: %{code})" - remote_invalid_response: "Nhận phản hồi không hợp lệ từ remote được quản lý." - remote_save_failed: "Không thể lưu kho với các tham số lấy từ remote." + build_failed: "Không thể tạo kho lưu trữ với cấu hình đã chọn. %{reason}" + managed_delete: "Không thể xóa kho lưu trữ được quản lý." + managed_delete_local: "Không thể xóa kho lưu trữ cục bộ trên hệ thống tệp tại '%{path}': %{error_message}" + empty_repository: "Kho lưu trữ tồn tại nhưng trống rỗng. Nó chưa chứa bất kỳ sửa đổi nào." + exists_on_filesystem: "Thư mục kho lưu trữ đã tồn tại trong hệ thống tập tin." + filesystem_access_failed: "Đã xảy ra lỗi khi truy cập kho lưu trữ trong hệ thống tệp: %{message}" + not_manageable: "OpenProject không thể quản lý nhà cung cấp kho lưu trữ này." + path_permission_failed: "Đã xảy ra lỗi khi tạo đường dẫn sau: %{path}. Hãy đảm bảo rằng OpenProject có thể ghi vào thư mục đó." + unauthorized: "Bạn không được phép truy cập vào kho lưu trữ hoặc thông tin xác thực không hợp lệ." + unavailable: "Kho lưu trữ không có sẵn." + exception_title: "Không thể truy cập kho lưu trữ: %{message}" + disabled_or_unknown_type: "Loại đã chọn %{type} bị vô hiệu hóa hoặc không còn khả dụng cho nhà cung cấp SCM %{vendor}." + disabled_or_unknown_vendor: "Nhà cung cấp SCM %{vendor} đã bị vô hiệu hóa hoặc không còn khả dụng." + remote_call_failed: "Gọi điều khiển từ xa được quản lý không thành công với thông báo '%{message}' (Mã: %{code})" + remote_invalid_response: "Đã nhận được phản hồi không hợp lệ từ điều khiển từ xa được quản lý." + remote_save_failed: "Không thể lưu kho lưu trữ với các tham số được truy xuất từ ​​​​điều khiển từ xa." git: instructions: - managed_url: "Đây là URL của kho Git được quản lý (cục bộ)." + managed_url: "Đây là URL của kho lưu trữ Git (cục bộ) được quản lý." path: >- Chỉ định đường dẫn đến repository Git của bạn (ví dụ, %{example_path}). Bạn cũng có thể sử dụng các remote repositories mà được nhân bản với một bản sao cục bộ bằng cách sử dụng một giá trị bắt đầu với http(s) :// hoặc file://. path_encoding: "Ghi đè mã hóa đường dẫn Git (Mặc định: UTF-8)" - local_title: "Liên kết kho Git cục bộ hiện có" - local_url: "URL cục bộ" - local_introduction: "Nếu bạn có một kho Git cục bộ hiện có, bạn có thể liên kết nó với OpenProject để truy cập từ bên trong ứng dụng." - managed_introduction: "Để OpenProject tự động tạo và tích hợp kho Git cục bộ." - managed_title: "Kho Git tích hợp vào OpenProject" + local_title: "Liên kết kho lưu trữ Git cục bộ hiện có" + local_url: "URL địa phương" + local_introduction: "Nếu bạn có kho lưu trữ Git cục bộ hiện có, bạn có thể liên kết nó với OpenProject để truy cập nó từ bên trong ứng dụng." + managed_introduction: "Hãy để OpenProject tự động tạo và tích hợp kho lưu trữ Git cục bộ." + managed_title: "Kho lưu trữ Git được tích hợp vào OpenProject" managed_url: "URL được quản lý" path: "Đường dẫn đến kho Git" path_encoding: "Mã hóa đường dẫn" - go_to_revision: "Đi đến phiên bản" - managed_remote: "Các kho được quản lý cho nhà cung cấp này được xử lý từ xa." - managed_remote_note: "Thông tin về URL và đường dẫn của kho này không có sẵn trước khi nó được tạo." + go_to_revision: "Đi đến bản sửa đổi" + managed_remote: "Các kho lưu trữ được quản lý cho nhà cung cấp này được xử lý từ xa." + managed_remote_note: "Thông tin về URL và đường dẫn của kho lưu trữ này không có sẵn trước khi tạo." managed_url: "URL được quản lý" settings: - automatic_managed_repos_disabled: "Tắt việc tạo tự động" - automatic_managed_repos: "Tạo tự động các kho được quản lý" - automatic_managed_repos_text: "Bằng cách thiết lập một nhà cung cấp ở đây, các dự án mới được tạo sẽ tự động nhận một kho được quản lý của nhà cung cấp này." - scm_vendor: "Hệ thống quản lý mã nguồn" - scm_type: "Loại kho" + automatic_managed_repos_disabled: "Tắt tính năng tạo tự động" + automatic_managed_repos: "Tự động tạo các kho lưu trữ được quản lý" + automatic_managed_repos_text: "Bằng cách đặt nhà cung cấp ở đây, các dự án mới tạo sẽ tự động nhận được kho lưu trữ được quản lý của nhà cung cấp này." + scm_vendor: "Hệ thống quản lý kiểm soát nguồn" + scm_type: "Loại kho lưu trữ" scm_types: - local: "Liên kết kho cục bộ hiện có" - existing: "Liên kết kho hiện có" - managed: "Tạo kho mới trong OpenProject" + local: "Liên kết kho lưu trữ cục bộ hiện có" + existing: "Liên kết kho lưu trữ hiện có" + managed: "Tạo kho lưu trữ mới trong OpenProject" storage: - not_available: "Tiêu thụ dung lượng đĩa không có sẵn cho kho này." - update_timeout: "Giữ thông tin dung lượng đĩa cần thiết cho kho trong N phút.\nVì việc tính toán dung lượng đĩa cần thiết cho kho có thể tốn kém, hãy tăng giá trị này để giảm tác động đến hiệu suất." - oauth_application_details: "Giá trị bí mật của khách hàng sẽ không còn khả dụng sau khi bạn đóng cửa sổ này. Vui lòng sao chép các giá trị này vào cài đặt tích hợp OpenProject của Nextcloud:" - oauth_application_details_link_text: "Đi đến trang cài đặt" - setup_documentation_details: "Nếu bạn cần trợ giúp để cấu hình một lưu trữ tệp mới, vui lòng kiểm tra tài liệu: " - setup_documentation_details_link_text: "File storages setup" - show_warning_details: "Để sử dụng lưu trữ tệp này, hãy nhớ kích hoạt mô-đun và lưu trữ cụ thể trong cài đặt dự án của từng dự án mong muốn." + not_available: "Mức tiêu thụ dung lượng ổ đĩa không có sẵn cho kho lưu trữ này." + update_timeout: "Giữ thông tin dung lượng ổ đĩa cần thiết cuối cùng cho kho lưu trữ trong N phút.\nVì việc tính dung lượng đĩa cần thiết của kho lưu trữ có thể tốn kém nên hãy tăng giá trị này để giảm tác động đến hiệu suất." + oauth_application_details: "Giá trị bí mật của máy khách sẽ không thể truy cập lại được sau khi bạn đóng cửa sổ này. Vui lòng sao chép các giá trị này vào cài đặt Tích hợp Nextcloud OpenProject:" + oauth_application_details_link_text: "Đi tới trang cài đặt" + setup_documentation_details: "Nếu bạn cần trợ giúp định cấu hình bộ lưu trữ tệp mới, vui lòng kiểm tra tài liệu:" + setup_documentation_details_link_text: "Thiết lập kho lưu trữ tập tin" + show_warning_details: "Để sử dụng bộ lưu trữ tệp này, hãy nhớ kích hoạt mô-đun và bộ lưu trữ cụ thể trong cài đặt dự án của từng dự án mong muốn." subversion: - existing_title: "Kho Subversion hiện có" - existing_introduction: "Nếu bạn có một kho Subversion hiện có, bạn có thể liên kết nó với OpenProject để truy cập từ bên trong ứng dụng." - existing_url: "URL hiện có" + existing_title: "Kho lưu trữ Subversion hiện có" + existing_introduction: "Nếu bạn có kho lưu trữ Subversion hiện có, bạn có thể liên kết nó với OpenProject để truy cập nó từ bên trong ứng dụng." + existing_url: "URL hiện tại" instructions: - managed_url: "Đây là URL của kho Subversion được quản lý (cục bộ)." - url: "Nhập URL của kho. Điều này có thể nhắm đến một kho cục bộ (bắt đầu với %{local_proto} ), hoặc một kho từ xa.\nCác sơ đồ URL sau đây được hỗ trợ:" - managed_title: "Kho Subversion tích hợp vào OpenProject" - managed_introduction: "Để OpenProject tự động tạo và tích hợp kho Subversion cục bộ." + managed_url: "Đây là URL của kho lưu trữ Subversion (cục bộ) được quản lý." + url: "Nhập URL kho lưu trữ. Điều này có thể nhắm mục tiêu kho lưu trữ cục bộ (bắt đầu bằng %{local_proto} ) hoặc kho lưu trữ từ xa.\nCác lược đồ URL sau được hỗ trợ:" + managed_title: "Kho lưu trữ Subversion được tích hợp vào OpenProject" + managed_introduction: "Hãy để OpenProject tự động tạo và tích hợp kho lưu trữ Subversion cục bộ." managed_url: "URL được quản lý" - password: "Mật khẩu kho" - username: "Tên người dùng kho" - truncated: "Xin lỗi, chúng tôi đã phải cắt ngắn thư mục này xuống %{limit} tệp. %{truncated} mục đã bị bỏ qua khỏi danh sách." - named_repository: "Kho %{vendor_name}" - update_settings_successful: "Cài đặt đã được lưu thành công." - url: "URL đến kho" + password: "Mật khẩu kho lưu trữ" + username: "Tên người dùng kho lưu trữ" + truncated: "Rất tiếc, chúng tôi đã phải cắt bớt thư mục này thành các tệp %{limit}. %{truncated} mục nhập đã bị bỏ qua khỏi danh sách." + named_repository: "kho lưu trữ %{vendor_name}" + update_settings_successful: "Các cài đặt đã được lưu thành công." + url: "URL tới kho lưu trữ" warnings: - cannot_annotate: "Tệp này không thể được chú thích." + cannot_annotate: "Tập tin này không thể được chú thích." scheduling: - manual: "set to Manual" - automatic: "set to Automatic" + manual: "đặt thành Thủ công" + automatic: "đặt thành Tự động" search_input_placeholder: "Tìm kiếm ..." - setting_allowed_link_protocols: "Allowed link protocols" + setting_allowed_link_protocols: "Giao thức liên kết được phép" setting_allowed_link_protocols_text_html: >- - Allow these protocols to be rendered as links in work package descriptions, long text fields and comments. For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. - setting_after_first_login_redirect_url: "First login redirect" + Cho phép các giao thức này được hiển thị dưới dạng liên kết trong mô tả gói công việc, trường văn bản dài và nhận xét. Ví dụ: %{tel_code} hoặc %{element_code}. Nhập một giao thức trên mỗi dòng.
    Giao thức %{http_code}, %{https_code} và %{mailto_code} luôn được cho phép. + setting_capture_external_links: "Chụp các liên kết bên ngoài" + setting_capture_external_links_text: > + Khi tính năng này được kích hoạt, tất cả các liên kết ngoài trong văn bản định dạng sẽ được chuyển hướng qua một trang cảnh báo trước khi rời khỏi ứng dụng. Điều này giúp bảo vệ người dùng khỏi các trang web bên ngoài có thể chứa mã độc hại. + setting_after_first_login_redirect_url: "Chuyển hướng đăng nhập lần đầu" setting_after_first_login_redirect_url_text_html: > - Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour.
    Example: /my/page - setting_after_login_default_redirect_url: "After login redirect" + Đặt đường dẫn để chuyển hướng người dùng sau lần đăng nhập đầu tiên của họ. Nếu trống, hãy chuyển hướng đến trang chủ để xem chuyến tham quan giới thiệu.
    Ví dụ: /my/page + setting_after_login_default_redirect_url: "Sau khi đăng nhập chuyển hướng" setting_after_login_default_redirect_url_text_html: > - Set a default path to redirect users after login, if no back link was provided. Redirects to home page if not set.
    Example: /my/page - setting_apiv3_cors_title: "Cross-Origin Resource Sharing (CORS)" + Đặt đường dẫn mặc định để chuyển hướng người dùng sau khi đăng nhập, nếu không có liên kết ngược nào được cung cấp. Chuyển hướng đến trang chủ nếu không được thiết lập.
    Ví dụ: /my/page + setting_apiv3_cors_title: "Chia sẻ tài nguyên chéo nguồn gốc (CORS)" setting_apiv3_cors_enabled: "Kích hoạt CORS" - setting_apiv3_cors_origins: "Các nguồn gốc được phép của API V3 Cross-Origin Resource Sharing (CORS)" + setting_apiv3_cors_origins: "Nguồn gốc được phép chia sẻ tài nguyên chéo nguồn gốc (CORS) của API V3" setting_apiv3_cors_origins_text_html: > Nếu CORS được kích hoạt, đây là các nguồn gốc được phép truy cập API của OpenProject.
    Vui lòng kiểm tra Tài liệu về Header Origin để biết cách chỉ định các giá trị mong đợi. - setting_apiv3_write_readonly_attributes: "Quyền ghi vào thuộc tính chỉ đọc" - setting_apiv3_write_readonly_attributes_instructions_html: > - Nếu được kích hoạt, API sẽ cho phép quản trị viên ghi các thuộc tính chỉ đọc tĩnh trong quá trình tạo, chẳng hạn như createdAt và author.
    Cảnh báo: Cài đặt này có trường hợp sử dụng cho ví dụ, nhập dữ liệu, nhưng cho phép quản trị viên giả mạo việc tạo các mục như các người dùng khác. Tuy nhiên, tất cả các yêu cầu tạo đều được ghi lại với tác giả thực sự.
    Để biết thêm thông tin về các thuộc tính và tài nguyên được hỗ trợ, vui lòng xem %{api_documentation_link}. + setting_apiv3_write_readonly_attributes: "Viết quyền truy cập vào các thuộc tính chỉ đọc" + setting_apiv3_write_readonly_attributes_instructions: > + Nếu được bật, API sẽ cho phép quản trị viên ghi các thuộc tính tĩnh chỉ đọc trong quá trình tạo, chẳng hạn như createAt và tác giả. + setting_apiv3_write_readonly_attributes_warning: > + Cài đặt này có một trường hợp sử dụng chẳng hạn như nhập dữ liệu nhưng cho phép quản trị viên mạo danh việc tạo các mục như những người dùng khác. Tuy nhiên, tất cả các yêu cầu tạo đang được ghi lại với tác giả thực sự. + setting_apiv3_write_readonly_attributes_additional: > + Để biết thêm thông tin về các thuộc tính và tài nguyên được hỗ trợ, vui lòng xem %{api_documentation_link}. setting_apiv3_max_page_size: "Kích thước trang API tối đa" - setting_apiv3_max_page_instructions_html: > - Đặt kích thước trang tối đa mà API sẽ phản hồi. Sẽ không thể thực hiện các yêu cầu API trả về nhiều giá trị trên một trang.
    Cảnh báo: Vui lòng chỉ thay đổi giá trị này nếu bạn chắc chắn về lý do cần thiết. Thiết lập giá trị cao sẽ dẫn đến tác động đáng kể đến hiệu suất, trong khi giá trị thấp hơn các tùy chọn trên trang sẽ gây lỗi trong các chế độ xem phân trang. - setting_apiv3_docs: "Tài liệu" - setting_apiv3_docs_enabled: "Kích hoạt trang tài liệu" + setting_apiv3_max_page_size_instructions: > + Đặt kích thước trang tối đa mà API sẽ phản hồi. Sẽ không thể thực hiện các yêu cầu API trả về nhiều giá trị hơn trên một trang. + setting_apiv3_max_page_size_warning: > + Vui lòng chỉ thay đổi giá trị này nếu bạn chắc chắn tại sao mình cần nó. Việc đặt thành giá trị cao sẽ dẫn đến tác động đáng kể đến hiệu suất, trong khi giá trị thấp hơn tùy chọn trên mỗi trang sẽ gây ra lỗi trong chế độ xem phân trang. + setting_apiv3_docs: "tài liệu" + setting_apiv3_docs_enabled: "Bật trang tài liệu" setting_apiv3_docs_enabled_instructions_html: > Nếu trang tài liệu được kích hoạt, bạn có thể xem tài liệu APIv3 tương tác tại %{link}. setting_apiv3_docs_enabled_instructions_warning: > - Please be aware that enabling the API docs on a production system may expose sensitive information or result in accidental loss of data when not being careful. We recommend to only enable this setting for development purposes. + Xin lưu ý rằng việc bật tài liệu API trên hệ thống sản xuất có thể làm lộ thông tin nhạy cảm hoặc vô tình làm mất dữ liệu khi bạn không cẩn thận. Chúng tôi khuyên bạn chỉ nên bật cài đặt này cho mục đích phát triển. setting_attachment_whitelist: "Danh sách trắng tải lên tệp đính kèm" setting_email_delivery_method: "Cách gửi email" - setting_emails_salutation: "Chào người dùng trong email với" - setting_oauth_allow_remapping_of_existing_users: "Allow remapping of existing users" + setting_emails_salutation: "Địa chỉ người dùng trong email với" + setting_oauth_allow_remapping_of_existing_users: "Cho phép ánh xạ lại người dùng hiện tại" setting_sendmail_location: "Vị trí của tệp thực thi sendmail (đường dẫn)" - setting_sendmail_arguments: "Arguments for sendmail" + setting_sendmail_arguments: "Đối số cho sendmail" setting_smtp_enable_starttls_auto: "Tự động sử dụng STARTTLS nếu hiện hữu" setting_smtp_ssl: "Sử dụng kết nối SSL" setting_smtp_address: "Máy chủ SMTP" @@ -4237,334 +4310,334 @@ vi: setting_smtp_user_name: "Tên truy cập SMTP" setting_smtp_password: "Mật khẩu SMTP" setting_smtp_domain: "Tên miền SMTP HELO" - setting_activity_days_default: "Số ngày hiển thị trong hoạt động dự án" - setting_app_subtitle: "Phụ đề ứng dụng" + setting_activity_days_default: "Ngày hiển thị trên hoạt động dự án" + setting_app_subtitle: "phụ đề ứng dụng" setting_app_title: "Tiêu đề ứng dụng" - setting_attachment_max_size: "Kích thước tối đa tệp đính kèm" - setting_show_work_package_attachments: "Hiển thị các tệp đính kèm trong tab tệp theo mặc định" + setting_attachment_max_size: "Tệp đính kèm tối đa. kích cỡ" + setting_show_work_package_attachments: "Hiển thị tệp đính kèm trong tab tệp theo mặc định" setting_antivirus_scan_mode: "Chế độ quét" - setting_antivirus_scan_action: "Hành động đối với tệp nhiễm virus" - setting_autofetch_changesets: "Tự động lấy các thay đổi của kho" + setting_antivirus_scan_action: "Hành động tập tin bị nhiễm" + setting_autofetch_changesets: "Tự động tìm nạp thay đổi kho lưu trữ" setting_autologin: "Tự động đăng nhập" - setting_available_languages: "Các ngôn ngữ có sẵn" - setting_bcc_recipients: "Người nhận bản sao ẩn (bcc)" + setting_available_languages: "Ngôn ngữ có sẵn" + setting_bcc_recipients: "Người nhận bản sao mù (bcc)" setting_brute_force_block_after_failed_logins: "Chặn người dùng sau số lần đăng nhập thất bại này" setting_brute_force_block_minutes: "Thời gian người dùng bị chặn" - setting_cache_formatted_text: "Lưu trữ văn bản đã định dạng" + setting_cache_formatted_text: "Văn bản được định dạng bộ đệm" setting_use_wysiwyg_description: "Chọn để cho phép bộ soạn thảo CKEditor đối với tất cả người dùng mặc định. CKEditor đã được hạn chế bởi GFM Markdown." - setting_column_options: "Các cột danh sách công việc mặc định" - setting_commit_fix_keywords: "Từ khóa sửa lỗi" - setting_commit_logs_encoding: "Mã hóa thông điệp cam kết" - setting_commit_logtime_activity_id: "Hoạt động cho thời gian đã ghi" - setting_commit_logtime_enabled: "Kích hoạt ghi thời gian" - setting_commit_ref_keywords: "Từ khóa tham chiếu" + setting_column_options: "Các cột liệt kê gói công việc mặc định" + setting_commit_fix_keywords: "Đang sửa từ khóa" + setting_commit_logs_encoding: "Cam kết mã hóa tin nhắn" + setting_commit_logtime_activity_id: "Hoạt động cho thời gian đã đăng nhập" + setting_commit_logtime_enabled: "Bật ghi thời gian" + setting_commit_ref_keywords: "Từ khóa tham khảo" setting_consent_time: "Thời gian đồng ý" setting_consent_info: "Văn bản thông tin đồng ý" - setting_consent_required: "Cần đồng ý" - setting_consent_decline_mail: "Địa chỉ email liên hệ từ chối đồng ý" - setting_cross_project_work_package_relations: "Cho phép các mối quan hệ gói công việc giữa các dự án" + setting_consent_required: "Cần có sự đồng ý" + setting_consent_decline_mail: "Địa chỉ email liên hệ đồng ý" + setting_cross_project_work_package_relations: "Cho phép quan hệ gói công việc giữa các dự án" setting_first_week_of_year: "Tuần đầu tiên trong năm" - setting_date_format: "Ngày" + setting_date_format: "ngày" setting_default_language: "Ngôn ngữ mặc định" - setting_default_projects_modules: "Các mô-đun kích hoạt mặc định cho dự án mới" - setting_default_projects_public: "Dự án mới là công khai theo mặc định" - setting_disable_password_login: "Disable password authentication" - setting_diff_max_lines_displayed: "Số dòng khác biệt tối đa hiển thị" - setting_omniauth_direct_login_provider: "Direct login SSO provider" - setting_display_subprojects_work_packages: "Hiển thị các gói công việc của các dự án phụ trên các dự án chính theo mặc định" - setting_duration_format: "Định dạng thời gian" + setting_default_projects_modules: "Các mô-đun được bật mặc định cho các dự án mới" + setting_default_projects_public: "Các dự án mới được công khai theo mặc định" + setting_disable_password_login: "Vô hiệu hóa xác thực mật khẩu" + setting_diff_max_lines_displayed: "Số dòng khác biệt tối đa được hiển thị" + setting_omniauth_direct_login_provider: "Nhà cung cấp SSO đăng nhập trực tiếp" + setting_display_subprojects_work_packages: "Hiển thị các gói công việc của dự án con trên các dự án chính theo mặc định" + setting_duration_format: "Định dạng thời lượng" setting_duration_format_hours_only: "Chỉ giờ" setting_duration_format_days_and_hours: "Ngày và giờ" - setting_duration_format_instructions: "Điều này xác định cách hiển thị thời gian công việc, thời gian còn lại và thời gian đã sử dụng." + setting_duration_format_instructions: "Điều này xác định cách hiển thị Công việc, Công việc còn lại và Khoảng thời gian đã sử dụng." setting_emails_footer: "Chân trang email" - setting_emails_header: "Đầu trang email" - setting_email_login: "Sử dụng email làm đăng nhập" - setting_enabled_scm: "SCM được kích hoạt" + setting_emails_header: "Tiêu đề email" + setting_email_login: "Sử dụng email làm thông tin đăng nhập" + setting_enabled_scm: "SCM đã bật" setting_enabled_projects_columns: "Các cột trong danh sách dự án được hiển thị theo mặc định" - setting_feeds_enabled: "Kích hoạt Feeds" + setting_feeds_enabled: "Bật nguồn cấp dữ liệu" setting_ical_enabled: "Kích hoạt đăng ký iCalendar" - setting_feeds_limit: "Giới hạn nội dung của feed" - setting_file_max_size_displayed: "Kích thước tối đa của tệp văn bản hiển thị nội tuyến" + setting_feeds_limit: "Giới hạn nội dung nguồn cấp dữ liệu" + setting_file_max_size_displayed: "Kích thước tối đa của tệp văn bản được hiển thị nội tuyến" setting_host_name: "Tên máy chủ" - setting_collaborative_editing_hocuspocus_url: "Hocuspocus server URL" - setting_collaborative_editing_hocuspocus_secret: "Hocuspocus server secret" + setting_collaborative_editing_hocuspocus_url: "URL máy chủ Hocuspocus" + setting_collaborative_editing_hocuspocus_secret: "Bí mật máy chủ Hocuspocus" setting_hours_per_day: "Giờ mỗi ngày" setting_hours_per_day_explanation: >- - Điều này xác định cái gì được coi là một "ngày" khi hiển thị thời gian theo ngày và giờ (ví dụ, nếu một ngày là 8 giờ, 32 giờ sẽ là 4 ngày). + Điều này xác định thế nào được coi là "ngày" khi hiển thị thời lượng theo ngày và giờ (ví dụ: nếu một ngày là 8 giờ thì 32 giờ sẽ là 4 ngày). setting_invitation_expiration_days: "Email kích hoạt hết hạn sau" - setting_invitation_expiration_days_caption: "Number of days after which the activation email expires." - setting_work_package_done_ratio: "Progress calculation mode" + setting_invitation_expiration_days_caption: "Số ngày sau đó email kích hoạt hết hạn." + setting_work_package_done_ratio: "Chế độ tính toán tiến độ" setting_work_package_done_ratio_field: "Dựa trên công việc" setting_work_package_done_ratio_field_caption_html: >- - % Complete can be freely set to any value. If you optionally enter a value for Work, Remaining work will automatically be derived. + % Hoàn thành có thể được đặt tùy ý thành bất kỳ giá trị nào. Nếu bạn tùy ý nhập giá trị cho Work, Công việc còn lại sẽ tự động được dẫn xuất. setting_work_package_done_ratio_status: "Dựa trên trạng thái" setting_work_package_done_ratio_status_caption_html: >- - Each status has a % Complete value associated with it. Changing status will change % Complete. + Mỗi trạng thái có một giá trị % Hoàn thành được liên kết với nó. Việc thay đổi trạng thái sẽ thay đổi % Hoàn thành. setting_work_package_done_ratio_explanation_html: > - Ở chế độ dựa trên công việc, % Hoàn thành có thể được tự do thiết lập thành bất kỳ giá trị nào. Nếu bạn tùy ý nhập giá trị cho Công việc, Công việc còn lại sẽ tự động được suy ra. Ở chế độ dựa trên trạng thái, mỗi trạng thái có giá trị % Hoàn thành được liên kết với nó. Thay đổi trạng thái sẽ thay đổi % Hoàn thành. + Ở chế độ work-based, % Hoàn thành có thể được đặt tùy ý thành bất kỳ giá trị nào. Nếu bạn tùy ý nhập một giá trị cho Công việc, Công việc còn lại sẽ tự động được bắt nguồn. Trong chế độ dựa trên trạng thái, mỗi trạng thái có một giá trị % Hoàn thành được liên kết với trạng thái đó. Việc thay đổi trạng thái sẽ thay đổi % Hoàn thành. setting_work_package_properties: "Thuộc tính gói công việc" setting_work_package_startdate_is_adddate: "Sử dụng ngày hiện tại làm ngày bắt đầu cho các gói công việc mới" - setting_work_packages_projects_export_limit: "Giới hạn xuất gói công việc / Dự án" + setting_work_packages_projects_export_limit: "Gói công việc / Giới hạn xuất dự án" setting_journal_aggregation_time_minutes: "Hành động của người dùng được tổng hợp trong" - setting_log_requesting_user: "Ghi lại người dùng đăng nhập, tên, và địa chỉ email cho tất cả các yêu cầu" + setting_log_requesting_user: "Ghi nhật ký thông tin đăng nhập, tên và địa chỉ thư của người dùng cho tất cả các yêu cầu" setting_login_required: "Yêu cầu xác thực" - setting_login_required_caption: "When checked, all requests to the application have to be authenticated." - setting_lost_password: "Enable password reset" - setting_lost_password_caption: "When checked, allow users to reset their own passwords." - setting_mail_from: "Địa chỉ email phát hành" + setting_login_required_caption: "Khi được chọn, tất cả các yêu cầu tới ứng dụng phải được xác thực." + setting_lost_password: "Bật đặt lại mật khẩu" + setting_lost_password_caption: "Khi được chọn, hãy cho phép người dùng đặt lại mật khẩu của riêng họ." + setting_mail_from: "Địa chỉ email phát thải" setting_mail_handler_api_key: "Khóa API" - setting_mail_handler_body_delimiters: "Cắt ngắn email sau một trong những dòng này" + setting_mail_handler_body_delimiters: "Cắt bớt email sau một trong những dòng này" setting_mail_handler_body_delimiter_regex: "Xén các email phù hợp với biểu thức này" setting_mail_handler_ignore_filenames: "Tập tin đính kèm mail bị bỏ qua" - setting_new_project_user_role_id: "Vai trò được cấp cho người dùng không phải quản trị viên khi tạo một dự án" - setting_new_project_send_confirmation_email: "Send notification to author when creating a new project" - setting_new_project_notification_text: "Notification text" - setting_password_active_rules: "Các lớp ký tự hoạt động" - setting_password_count_former_banned: "Số lượng mật khẩu gần đây bị cấm tái sử dụng" - setting_password_days_valid: "Số ngày, sau đó yêu cầu thay đổi mật khẩu" + setting_new_project_user_role_id: "Vai trò được cấp cho người dùng không phải quản trị viên tạo dự án" + setting_new_project_send_confirmation_email: "Gửi thông báo cho tác giả khi tạo dự án mới" + setting_new_project_notification_text: "Văn bản thông báo" + setting_password_active_rules: "Lớp nhân vật hoạt động" + setting_password_count_former_banned: "Số lượng mật khẩu được sử dụng gần đây nhất bị cấm sử dụng lại" + setting_password_days_valid: "Số ngày thực hiện thay đổi mật khẩu sau đó" setting_password_min_length: "Chiều dài tối thiểu" - setting_password_min_adhered_rules: "Số lượng lớp yêu cầu tối thiểu" - setting_per_page_options: "Tùy chọn số đối tượng trên mỗi trang" - setting_percent_complete_on_status_closed: "% Complete when status is closed" - setting_percent_complete_on_status_closed_no_change: "No change" + setting_password_min_adhered_rules: "Số lượng lớp học yêu cầu tối thiểu" + setting_per_page_options: "Tùy chọn đối tượng trên mỗi trang" + setting_percent_complete_on_status_closed: "% Hoàn thành khi trạng thái đóng" + setting_percent_complete_on_status_closed_no_change: "Không thay đổi" setting_percent_complete_on_status_closed_no_change_caption_html: >- - The value of % Complete will not change even when a work package is closed. - setting_percent_complete_on_status_closed_set_100p: "Automatically set to 100%" + Giá trị của % Complete sẽ không thay đổi ngay cả khi đóng gói công việc. + setting_percent_complete_on_status_closed_set_100p: "Tự động đặt thành 100%" setting_percent_complete_on_status_closed_set_100p_caption: >- - A closed work package is considered complete. - setting_plain_text_mail: "Email văn bản thuần túy (không có HTML)" + Một gói công việc khép kín được coi là hoàn thành. + setting_plain_text_mail: "Thư văn bản thuần túy (không có HTML)" setting_protocol: "Giao thức" - setting_project_gantt_query: "Xem Gantt của danh mục dự án" - setting_project_gantt_query_text: "Bạn có thể chỉnh sửa truy vấn được sử dụng để hiển thị biểu đồ Gantt từ trang tổng quan dự án." + setting_project_gantt_query: "Danh mục dự án Chế độ xem Gantt" + setting_project_gantt_query_text: "Bạn có thể sửa đổi truy vấn được sử dụng để hiển thị biểu đồ Gantt từ trang tổng quan dự án." setting_security_badge_displayed: "Hiển thị huy hiệu bảo mật" setting_registration_footer: "Chân trang đăng ký" - setting_registration_footer_caption: "This text is displayed in the footer of the registration page. Use the HTML editor to format the text for each selected language." - setting_repositories_automatic_managed_vendor: "Loại nhà cung cấp kho tự động" - setting_repositories_encodings: "Mã hóa kho" - setting_repository_storage_cache_minutes: "Bộ nhớ cache kích thước đĩa kho" - setting_repository_checkout_display: "Hiển thị hướng dẫn kiểm tra" - setting_repository_checkout_base_url: "URL cơ sở kiểm tra" - setting_repository_checkout_text: "Văn bản hướng dẫn kiểm tra" - setting_repository_log_display_limit: "Số lượng sửa đổi tối đa hiển thị trên nhật ký tệp" - setting_repository_truncate_at: "Số lượng tệp tối đa hiển thị trong trình duyệt kho" + setting_registration_footer_caption: "Văn bản này được hiển thị ở chân trang của trang đăng ký. Sử dụng trình soạn thảo HTML để định dạng văn bản cho từng ngôn ngữ đã chọn." + setting_repositories_automatic_managed_vendor: "Loại nhà cung cấp kho lưu trữ tự động" + setting_repositories_encodings: "Mã hóa kho lưu trữ" + setting_repository_storage_cache_minutes: "Bộ đệm kích thước đĩa lưu trữ" + setting_repository_checkout_display: "Hiển thị hướng dẫn thanh toán" + setting_repository_checkout_base_url: "URL cơ sở thanh toán" + setting_repository_checkout_text: "Văn bản hướng dẫn thanh toán" + setting_repository_log_display_limit: "Số lượng bản sửa đổi tối đa được hiển thị trên nhật ký tệp" + setting_repository_truncate_at: "Số lượng tệp tối đa được hiển thị trong trình duyệt kho lưu trữ" setting_rest_api_enabled: "Kích hoạt dịch vụ web REST" - setting_self_registration: "Đăng ký tự động" + setting_self_registration: "Tự đăng ký" setting_self_registration_caption: > - Choose the self-registration mechanism for users. Be careful with the setting you choose, as some options allow users to activate their own accounts to this instance. + Lựa chọn cơ chế tự đăng ký cho người dùng. Hãy cẩn thận với cài đặt bạn chọn vì một số tùy chọn cho phép người dùng kích hoạt tài khoản của chính họ trong trường hợp này. setting_self_registration_warning: > - The user will be able to activate their own accounts. Please note that this will give them access to all public projects and their content. Please make sure that no sensitive or private data is exposed in public projects. - setting_self_registration_disabled: "VÔ HIỆU" + Người dùng sẽ có thể kích hoạt tài khoản của riêng họ. Xin lưu ý rằng điều này sẽ cấp cho họ quyền truy cập vào tất cả các dự án công cộng và nội dung của chúng. Hãy đảm bảo rằng không có dữ liệu nhạy cảm hoặc riêng tư nào bị lộ trong các dự án công cộng. + setting_self_registration_disabled: "bị vô hiệu hóa" setting_self_registration_disabled_caption: > - No accounts can be registered on their own. Only administrators and users with the global permission to create new users are able to create new accounts. - setting_self_registration_activation_by_email: "Account activation by email" + Không có tài khoản nào có thể được đăng ký riêng. Chỉ quản trị viên và người dùng có quyền toàn cầu để tạo người dùng mới mới có thể tạo tài khoản mới. + setting_self_registration_activation_by_email: "Kích hoạt tài khoản qua email" setting_self_registration_activation_by_email_caption: > - Users can register on their own and activate their account after confirming their email address. Administrators have no moderation control over the activation process. - setting_self_registration_automatic_activation: "Automatic account activation" + Người dùng có thể tự đăng ký và kích hoạt tài khoản sau khi xác nhận địa chỉ email của họ. Quản trị viên không có quyền kiểm duyệt quá trình kích hoạt. + setting_self_registration_automatic_activation: "Kích hoạt tài khoản tự động" setting_self_registration_automatic_activation_caption: > - Users can register on their own. Their accounts are immediately active without further action. Administrators have no moderation control over the activation process. - setting_self_registration_manual_activation: "Manual account activation" + Người dùng có thể tự đăng ký. Tài khoản của họ ngay lập tức hoạt động mà không cần thực hiện thêm hành động nào. Quản trị viên không có quyền kiểm duyệt quá trình kích hoạt. + setting_self_registration_manual_activation: "Kích hoạt tài khoản thủ công" setting_self_registration_manual_activation_caption: > - Users can register on their own. Their accounts are in a pending state until an administrator or user with the global permission to create or manage users activates them. - setting_session_ttl: "Session expiration time after inactivity" + Người dùng có thể tự đăng ký. Tài khoản của họ ở trạng thái chờ xử lý cho đến khi quản trị viên hoặc người dùng có quyền toàn cầu tạo hoặc quản lý người dùng kích hoạt chúng. + setting_session_ttl: "Thời gian hết hạn phiên sau khi không hoạt động" setting_session_ttl_hint: "Giá trị dưới 5 hoạt động như bị vô hiệu hóa" setting_session_ttl_enabled: "Phiên hết hạn" setting_start_of_week: "Tuần Bắt đầu" - setting_sys_api_enabled: "Kích hoạt dịch vụ quản lý kho" - setting_sys_api_description: "Dịch vụ quản lý kho cung cấp tích hợp và xác thực người dùng cho việc truy cập kho." - setting_time_format: "Thời gian" - setting_total_percent_complete_mode: "Calculation of % Complete hierarchy totals" - setting_total_percent_complete_mode_work_weighted_average: "Weighted by work" + setting_sys_api_enabled: "Kích hoạt dịch vụ web quản lý kho lưu trữ" + setting_sys_api_description: "Dịch vụ web quản lý kho lưu trữ cung cấp sự tích hợp và ủy quyền cho người dùng để truy cập vào kho lưu trữ." + setting_time_format: "thời gian" + setting_total_percent_complete_mode: "Tính % tổng số thứ bậc hoàn thành" + setting_total_percent_complete_mode_work_weighted_average: "Bị đè nặng bởi công việc" setting_total_percent_complete_mode_work_weighted_average_caption_html: >- - The total % Complete will be weighted against the Work of each work package in the hierarchy. Work packages without Work will be ignored. - setting_total_percent_complete_mode_simple_average: "Simple average" + total % Complete sẽ được tính trọng số theo Work của từng gói công việc trong hệ thống phân cấp. Các gói công việc không có Work sẽ bị bỏ qua. + setting_total_percent_complete_mode_simple_average: "Trung bình đơn giản" setting_total_percent_complete_mode_simple_average_caption_html: >- - Work is ignored and the total % Complete will be a simple average of % Complete values of work packages in the hierarchy. - setting_accessibility_mode_for_anonymous: "Kích hoạt chế độ truy cập cho người dùng ẩn danh" + Work bị bỏ qua và total % Complete sẽ là giá trị trung bình đơn giản của các giá trị % Complete của các gói công việc trong hệ thống phân cấp. + setting_accessibility_mode_for_anonymous: "Bật chế độ trợ năng cho người dùng ẩn danh" setting_user_format: "Định dạng tên người dùng" setting_user_default_timezone: "Time zone mặc định" - setting_users_deletable_by_admins: "Tài khoản người dùng có thể bị xóa bởi quản trị viên" - setting_users_deletable_by_self: "Người dùng có thể xóa tài khoản của họ" - setting_welcome_text: "Văn bản chào mừng" - setting_welcome_title: "Tiêu đề chào mừng" + setting_users_deletable_by_admins: "Tài khoản người dùng có thể bị quản trị viên xóa" + setting_users_deletable_by_self: "Người dùng được phép xóa tài khoản của họ" + setting_welcome_text: "Văn bản chặn chào mừng" + setting_welcome_title: "Tiêu đề khối chào mừng" setting_welcome_on_homescreen: "Hiển thị khối chào mừng trên màn hình chính" - setting_work_package_list_default_highlighting_mode: "Chế độ tô sáng mặc định" - setting_work_package_list_default_highlighted_attributes: "Các thuộc tính được tô sáng mặc định trong dòng" + setting_work_package_list_default_highlighting_mode: "Chế độ đánh dấu mặc định" + setting_work_package_list_default_highlighted_attributes: "Thuộc tính được đánh dấu nội tuyến mặc định" setting_working_days: "Ngày làm việc" settings: errors: - not_writable: "The setting is not writable and can only be changed by a sysadmin." - failed_to_update: "Setting '%{name}' could not be updated: %{message}" + not_writable: "Cài đặt này không thể ghi và chỉ có thể được thay đổi bởi quản trị viên hệ thống." + failed_to_update: "Không thể cập nhật cài đặt '%{name}': %{message}" authentication: - login: "Đăng nhập" - registration: "Registration" - sso: "Single Sign-On (SSO)" + login: "đăng nhập" + registration: "đăng ký" + sso: "Đăng nhập một lần (SSO)" omniauth_direct_login_hint_html: > - If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
    Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. + Nếu tùy chọn này đang hoạt động, yêu cầu đăng nhập sẽ chuyển hướng đến nhà cung cấp omniauth đã định cấu hình. Trang đăng nhập thả xuống và trang đăng nhập sẽ bị vô hiệu hóa.
    Lưu ý: Trừ khi bạn cũng tắt tính năng đăng nhập bằng mật khẩu, khi bật tùy chọn này, người dùng vẫn có thể đăng nhập nội bộ bằng cách truy cập trang đăng nhập %{internal_path}. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. + Nếu được bật, sẽ cho phép mọi nhà cung cấp danh tính được định cấu hình đăng nhập người dùng hiện tại dựa trên tên người dùng của họ, ngay cả khi người dùng chưa từng đăng nhập thông qua nhà cung cấp đó trước đây. Điều này có thể hữu ích khi di chuyển phiên bản OpenProject sang nhà cung cấp SSO mới, nhưng không được khuyến nghị khi sử dụng nhà cung cấp không được tất cả người dùng phiên bản của bạn tin cậy. attachments: whitelist_text_html: > - Xác định danh sách các phần mở rộng tệp hợp lệ và/hoặc loại mime cho các tệp tải lên.
    Nhập các phần mở rộng tệp (ví dụ: %{ext_example}) hoặc loại mime (ví dụ: %{mime_example}).
    Để trống để cho phép tải lên bất kỳ loại tệp nào. Nhiều giá trị được phép (mỗi giá trị trên một dòng). + Xác định danh sách các phần mở rộng tệp hợp lệ và/hoặc loại mime cho các tệp được tải lên.
    Nhập phần mở rộng tệp (ví dụ: %{ext_example}) hoặc loại mime (ví dụ: %{mime_example}).
    Để trống để cho phép tải lên mọi loại tệp. Cho phép nhiều giá trị (mỗi giá trị một dòng). show_work_package_attachments: > - Vô hiệu hóa tùy chọn này sẽ ẩn danh sách đính kèm trên tab tệp gói công việc cho các dự án mới. Các tệp đính kèm trong mô tả của một gói công việc vẫn sẽ được tải lên kho lưu trữ đính kèm nội bộ. + Việc tắt tùy chọn này sẽ ẩn danh sách tệp đính kèm trên tab tệp gói công việc cho các dự án mới. Các tệp đính kèm trong phần mô tả của gói công việc sẽ vẫn được tải lên bộ lưu trữ tệp đính kèm nội bộ. antivirus: title: "Quét virus" - clamav_ping_failed: "Không thể kết nối với daemon ClamAV. Vui lòng kiểm tra cấu hình và thử lại." + clamav_ping_failed: "Không thể kết nối trình nền ClamAV. Hãy kiểm tra kỹ cấu hình và thử lại." remaining_quarantined_files_html: > Quét virus đã bị vô hiệu hóa. Có %{file_count} tệp vẫn còn trong cách ly. Để xem các tệp đã cách ly, vui lòng truy cập liên kết này: %{link} remaining_scan_complete_html: > - Các tệp còn lại đã được quét. Có %{file_count} tệp trong cách ly. Bạn sẽ được chuyển hướng đến trang cách ly. Sử dụng trang này để xóa hoặc bỏ qua các tệp đã cách ly. + Các tập tin còn lại đã được quét. Có %{file_count} đang bị cách ly. Bạn đang được chuyển hướng đến trang cách ly. Sử dụng trang này để xóa hoặc ghi đè các tập tin đã cách ly. remaining_rescanned_files: > - Quét virus đã được kích hoạt thành công. Có %{file_count} tệp đã được tải lên trước đó và vẫn cần được quét. Quá trình này đã được lên lịch chạy nền. Các tệp sẽ vẫn có thể truy cập trong quá trình quét. + Quét virus đã được kích hoạt thành công. Có %{file_count} đã được tải lên trước đó và vẫn cần được quét. Quá trình này đã được lên lịch ở chế độ nền. Các tập tin sẽ vẫn có thể truy cập được trong quá trình quét. actions: - delete: "Xóa tệp" - quarantine: "Cách ly tệp" + delete: "Xóa tập tin" + quarantine: "Cách ly tập tin" instructions_html: > Chọn hành động để thực hiện đối với các tệp có virus đã được phát hiện:
    • %{quarantine_option}: Cách ly tệp, ngăn chặn người dùng truy cập vào nó. Các quản trị viên có thể xem và xóa các tệp đã cách ly trong quản trị.
    • %{delete_option}: Xóa tệp ngay lập tức.
    modes: - clamav_socket_html: 'Nhập ổ cắm vào daemon clamd, ví dụ: %{example}' - clamav_host_html: 'Nhập tên máy chủ và cổng vào daemon clamd được phân tách bằng dấu hai chấm. Ví dụ: %{example}' + clamav_socket_html: 'Nhập ổ cắm vào daemon ngao, ví dụ: %{example}' + clamav_host_html: 'Nhập tên máy chủ và cổng vào trình nền Clamd được phân tách bằng dấu hai chấm. ví dụ: %{example}' description_html: > Chọn chế độ mà tích hợp trình quét antivirus nên hoạt động.
    • %{disabled_option}: Các tệp tải lên sẽ không được quét virus.
    • %{socket_option}: Bạn đã thiết lập ClamAV trên cùng một máy chủ với OpenProject và daemon quét clamd đang chạy nền
    • %{host_option}: Bạn đang truyền tệp đến một máy chủ quét virus bên ngoài.
    - brute_force_prevention: "Ngăn chặn người dùng tự động" + brute_force_prevention: "Tự động chặn người dùng" date_format: first_date_of_week_and_year_set: > - Nếu một trong các tùy chọn "%{day_of_week_setting_name}" hoặc "%{first_week_setting_name}" được đặt, cái còn lại cũng phải được đặt để tránh sự không nhất quán trên giao diện người dùng. + Nếu một trong hai tùy chọn "%{day_of_week_setting_name}" hoặc "%{first_week_setting_name}" được đặt thì tùy chọn còn lại cũng phải được đặt để tránh sự mâu thuẫn ở giao diện người dùng. first_week_of_year_text_html: > Chọn ngày của tháng Một thuộc tuần đầu tiên của năm. Giá trị này cùng với ngày đầu tiên của tuần xác định tổng số tuần trong năm. Để biết thêm thông tin, vui lòng xem tài liệu của chúng tôi về chủ đề này. experimental: - save_confirmation: Cẩn thận! Nguy cơ mất dữ liệu! Chỉ kích hoạt các tính năng thử nghiệm nếu bạn không ngại làm hỏng cài đặt OpenProject của mình và mất tất cả dữ liệu của nó. - warning_toast: Cờ tính năng là các cài đặt kích hoạt các tính năng vẫn đang được phát triển. Chúng chỉ nên được sử dụng cho mục đích kiểm tra. Chúng không bao giờ nên được kích hoạt trên các cài đặt OpenProject chứa dữ liệu quan trọng. Những tính năng này rất có thể sẽ làm hỏng dữ liệu của bạn. Sử dụng chúng theo rủi ro của bạn. + save_confirmation: Thận trọng! Nguy cơ mất dữ liệu! Chỉ kích hoạt các tính năng thử nghiệm nếu bạn không ngại phá vỡ cài đặt OpenProject và mất tất cả dữ liệu của nó. + warning_toast: Cờ tính năng là cài đặt kích hoạt các tính năng vẫn đang được phát triển. Chúng chỉ được sử dụng cho mục đích thử nghiệm. Chúng sẽ không bao giờ được kích hoạt trên các bản cài đặt OpenProject chứa dữ liệu quan trọng. Những tính năng này rất có thể sẽ làm hỏng dữ liệu của bạn. Sử dụng chúng có nguy cơ của riêng bạn. feature_flags: Cờ tính năng - general: "Tổng quan" + general: "chung" highlighting: mode_long: - inline: "Tô sáng thuộc tính (các) trực tiếp" - none: "Không có đánh dấu" + inline: "Đánh dấu (các) thuộc tính nội tuyến" + none: "Không làm nổi bật" status: "Toàn bộ hàng theo Trạng thái" - type: "Toàn bộ hàng theo Loại" - priority: "Toàn bộ hàng theo Mức độ ưu tiên" + type: "Toàn bộ hàng theo loại" + priority: "Toàn bộ hàng theo mức độ ưu tiên" icalendar: enable_subscriptions_text_html: Cho phép người dùng với quyền cần thiết đăng ký các lịch OpenProject và truy cập thông tin gói công việc qua một ứng dụng lịch bên ngoài. Lưu ý: Vui lòng đọc về đăng ký iCalendar để hiểu các rủi ro bảo mật tiềm ẩn trước khi kích hoạt tính năng này. language_name_being_default: "%{language_name} (mặc định)" notifications: - events_explanation: "Quy định cho sự kiện nào một email được gửi đi. Các gói công việc bị loại trừ khỏi danh sách này vì thông báo cho chúng có thể được cấu hình riêng cho mỗi người dùng." - delay_minutes_explanation: "Gửi email có thể bị trì hoãn để cho phép người dùng với thông báo trong ứng dụng được xác nhận thông báo trong ứng dụng trước khi email được gửi đi. Người dùng đã đọc một thông báo trong ứng dụng sẽ không nhận được email cho thông báo đã đọc." + events_explanation: "Quản lý sự kiện mà email được gửi đi. Các gói công việc được loại trừ khỏi danh sách này vì thông báo cho chúng có thể được cấu hình cụ thể cho từng người dùng." + delay_minutes_explanation: "Việc gửi email có thể bị trì hoãn để cho phép người dùng đã định cấu hình thông báo trong ứng dụng xác nhận thông báo trong ứng dụng trước khi thư được gửi đi. Người dùng đọc thông báo trong ứng dụng sẽ không nhận được email cho thông báo đã đọc." other: "Khác" - passwords: "Mật khẩu" + passwords: "mật khẩu" project_attributes: heading: "Các thuộc tính dự án" - label_for_all_projects: "All projects" + label_for_all_projects: "Tất cả dự án" label_new_attribute: "Thuộc tính dự án" - label_new_section: "Phần" + label_new_section: "phần" label_edit_section: "Chỉnh sửa tiêu đề" - label_section_actions: "Hành động phần" - heading_description: "Các thuộc tính dự án này xuất hiện trên trang tổng quan của mỗi dự án. Bạn có thể thêm thuộc tính mới, nhóm chúng thành các phần và sắp xếp chúng theo ý thích. Các thuộc tính này có thể được bật hoặc tắt nhưng không thể sắp xếp lại ở cấp dự án." + label_section_actions: "Hành động của phần" + heading_description: "Các thuộc tính dự án này xuất hiện trong trang tổng quan của từng dự án. Bạn có thể thêm các thuộc tính mới, nhóm chúng thành các phần và sắp xếp lại chúng theo ý muốn. Các thuộc tính này có thể được bật hoặc tắt nhưng không được sắp xếp lại ở cấp dự án." label_project_custom_field_actions: "Hành động thuộc tính dự án" label_no_project_custom_fields: "Không có thuộc tính dự án nào được xác định trong phần này" edit: - description: "Những thay đổi đối với thuộc tính dự án này sẽ được phản ánh trong tất cả các dự án mà nó được bật. Các thuộc tính bắt buộc không thể bị tắt ở mức dự án." + description: "Những thay đổi đối với thuộc tính dự án này sẽ được phản ánh trong tất cả các dự án được bật. Các thuộc tính bắt buộc không thể bị vô hiệu hóa trên cơ sở từng dự án." new: heading: "Thuộc tính mới" - description: "Những thay đổi đối với thuộc tính dự án này sẽ được phản ánh trong tất cả các dự án mà nó được bật. Các thuộc tính bắt buộc không thể bị tắt ở mức dự án." + description: "Những thay đổi đối với thuộc tính dự án này sẽ được phản ánh trong tất cả các dự án được bật. Các thuộc tính bắt buộc không thể bị vô hiệu hóa trên cơ sở từng dự án." sections: display_representation: overview: - label: "Project attribute shown in:" + label: "Thuộc tính dự án được hiển thị trong:" main_area: - label: "Main area" - description: "Add all the project attributes as individual widgets in the main section of the project overview." + label: "Khu vực chính" + description: "Thêm tất cả thuộc tính dự án dưới dạng các tiện ích riêng lẻ trong phần chính của tổng quan dự án." side_panel: - label: "Side panel" - description: "Add all the project attributes in a section inside the right side panel in the project overview." + label: "Bảng điều khiển bên" + description: "Thêm tất cả thuộc tính dự án vào một phần bên trong bảng điều khiển bên phải trong phần tổng quan về dự án." project_initiation_request: header_description: > - OpenProject can generate a step-by-step wizard to help project managers fill out a project initiation request. You can choose which project attributes should be included and create a PDF artifact as a result. + OpenProject có thể tạo trình hướng dẫn từng bước để giúp người quản lý dự án điền vào yêu cầu khởi tạo dự án. Bạn có thể chọn những thuộc tính dự án nào sẽ được đưa vào và kết quả là tạo một tạo phẩm PDF. status: - submitted: "%{wizard_name} has been submitted" - submitted_description: "Click the button below to go to the work package for the submission process." - submitted_button: "Open submission request" - not_completed: "%{wizard_name} not yet completed" - not_completed_description: "Provide the necessary information by filling the attributes and get the project started." + submitted: "%{wizard_name} đã được gửi" + submitted_description: "Nhấp vào nút bên dưới để chuyển đến gói công việc cho quá trình gửi bài." + submitted_button: "Mở yêu cầu gửi" + not_completed: "%{wizard_name} chưa hoàn thành" + not_completed_description: "Cung cấp thông tin cần thiết bằng cách điền vào các thuộc tính và bắt đầu dự án." wizard_status_button: - project_initiation_request: "Open project initiation request" - project_creation_wizard: "Open project creation wizard" - project_mandate: "Open project mandate" + project_initiation_request: "Mở yêu cầu bắt đầu dự án" + project_creation_wizard: "Mở trình hướng dẫn tạo dự án" + project_mandate: "Nhiệm vụ mở dự án" blankslate: - title: "Initiation request not enabled" - description: "OpenProject can generate a step-by-step wizard to help project managers fill out a project initiation request. You can choose which project attributes should be included and what to do with the output document. Enable it here to start configuring the wizard." + title: "Yêu cầu bắt đầu không được kích hoạt" + description: "OpenProject có thể tạo trình hướng dẫn từng bước để giúp người quản lý dự án điền vào yêu cầu khởi tạo dự án. Bạn có thể chọn những thuộc tính dự án nào sẽ được đưa vào và những việc cần làm với tài liệu đầu ra. Kích hoạt nó ở đây để bắt đầu cấu hình trình hướng dẫn." disable_dialog: - title: "Disable project initiation request" - heading: "Disable this project initiation request?" - confirmation_message: "The initiation request wizard will no longer be available to new projects based on this template. Project managers and project owners will need to manually configure and fill out the relevant information in the Project overview." - checkbox_message: "I understand that this action is not reversible" + title: "Tắt yêu cầu khởi tạo dự án" + heading: "Tắt yêu cầu bắt đầu dự án này?" + confirmation_message: "Trình hướng dẫn yêu cầu khởi tạo sẽ không còn khả dụng cho các dự án mới dựa trên mẫu này nữa. Người quản lý dự án và chủ sở hữu dự án sẽ cần định cấu hình và điền thông tin liên quan theo cách thủ công trong phần Tổng quan về dự án." + checkbox_message: "Tôi hiểu rằng hành động này không thể đảo ngược" name: - artifact_name: "Artifact name" - artifact_name_caption: "Choose the name for this artifact that your project management framework recommends." + artifact_name: "Tên hiện vật" + artifact_name_caption: "Chọn tên cho tạo phẩm này mà khung quản lý dự án của bạn đề xuất." options: - project_initiation_request: "Project initiation request" - project_creation_wizard: "Project creation wizard" - project_mandate: "Project mandate" + project_initiation_request: "Yêu cầu khởi tạo dự án" + project_creation_wizard: "Trình hướng dẫn tạo dự án" + project_mandate: "Nhiệm vụ dự án" submission: description_template: > - **This work package was automatically created upon completion of the %{wizard_name} workflow.** A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: - description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." - work_package_type: "Work package type" - work_package_type_caption: "The work package type that should be used to store the completed artifact." - status_when_submitted: "Status when submitted" - status_when_submitted_caption: "The status the generated work package will transition to once the request is submitted." - send_confirmation_email: "Send confirmation email to the user who submitted the project initiation request" - assignee: "Assignee when submitted" - assignee_caption_html: "The user or group assigned to this project attribute will also become the assignee of the new work package. This list includes active project attributes of type User only." - confirmation_email_text: "Confirmation email text" - confirmation_email_default: "Hello,\n\nYou submitted a project initiation request for **%{project_name}**. It is now awaiting review.\nClick the link below to access the work package with your request." - work_package_comment: "Work package comment" - work_package_comment_caption: "The assignee selected above will automatically be @mentioned in the comment." - work_package_comment_default: "A project initiation request for **%{project_name}** was submitted and is awaiting review." + **Gói công việc này được tạo tự động sau khi hoàn thành quy trình làm việc " %{wizard_name} ".** Một tệp PDF chứa tất cả thông tin đã nộp đã được tạo và đính kèm vào gói công việc này để tham khảo và kiểm toán. Nếu bạn cần cập nhật hoặc chạy lại các bước khởi tạo, bạn có thể mở lại trình hướng dẫn bất cứ lúc nào bằng cách sử dụng liên kết bên dưới: + description: "Khi người dùng gửi yêu cầu bắt đầu dự án, một gói công việc mới sẽ được tạo với tạo phẩm yêu cầu được đính kèm dưới dạng tệp PDF. Các cài đặt bên dưới xác định loại, trạng thái và người được giao cho gói công việc mới này." + work_package_type: "Loại gói công việc" + work_package_type_caption: "Loại gói công việc nên được sử dụng để lưu trữ tạo phẩm đã hoàn thành." + status_when_submitted: "Trạng thái khi gửi" + status_when_submitted_caption: "Trạng thái của gói công việc được tạo sẽ chuyển sang trạng thái sau khi yêu cầu được gửi." + send_confirmation_email: "Gửi email xác nhận cho người dùng đã gửi yêu cầu bắt đầu dự án" + assignee: "Người được chuyển nhượng khi nộp" + assignee_caption_html: "Người dùng hoặc nhóm được gán cho thuộc tính dự án này cũng sẽ trở thành người được chuyển nhượng gói công việc mới. Danh sách này chỉ bao gồm các thuộc tính dự án đang hoạt động thuộc loại User." + confirmation_email_text: "Văn bản email xác nhận" + confirmation_email_default: "Xin chào,\n\nBạn đã gửi yêu cầu bắt đầu dự án cho **%{project_name}**. Bây giờ nó đang chờ xem xét.\nNhấp vào liên kết bên dưới để truy cập gói công việc với yêu cầu của bạn." + work_package_comment: "Nhận xét gói công việc" + work_package_comment_caption: "Người được giao được chọn ở trên sẽ tự động được @đề cập trong nhận xét." + work_package_comment_default: "Yêu cầu bắt đầu dự án cho **%{project_name}** đã được gửi và đang chờ xem xét." project_phase_definitions: - heading: "Project life cycle" - heading_description: "Project life cycle defines the project phases that can be used for your project planning and will appear in the overview page of each project. These attributes can be enabled or disabled but not re-ordered at a project level." + heading: "Vòng đời dự án" + heading_description: "Vòng đời dự án xác định các giai đoạn dự án có thể được sử dụng để lập kế hoạch dự án của bạn và sẽ xuất hiện trên trang tổng quan của từng dự án. Các thuộc tính này có thể được bật hoặc tắt nhưng không được sắp xếp lại ở cấp dự án." label_add: "Thêm" - label_add_description: "Add project phase definition" + label_add_description: "Thêm định nghĩa giai đoạn dự án" filter: - label: "Search project phase" - section_header: "Phases" - non_defined: "No phases are currently defined." - phase_gates: "Phase gates" + label: "Tìm kiếm giai đoạn dự án" + section_header: "giai đoạn" + non_defined: "Hiện tại không có giai đoạn nào được xác định." + phase_gates: "Cổng pha" new: - description: "Changes to this project phase will be reflected in all projects where it is enabled." - heading: "New phase" - both_gate: "Start and finish gate" - no_gate: "No gate" - start_gate: "Start gate" - start_gate_caption: "Add a gate with the start date of the phase" - finish_gate: "Finish gate" - finish_gate_caption: "Add a gate with the end date of the phase" + description: "Những thay đổi đối với giai đoạn dự án này sẽ được phản ánh trong tất cả các dự án được kích hoạt." + heading: "Giai đoạn mới" + both_gate: "Cổng bắt đầu và kết thúc" + no_gate: "Không có cổng" + start_gate: "Cổng bắt đầu" + start_gate_caption: "Thêm một cổng có ngày bắt đầu của giai đoạn" + finish_gate: "cổng kết thúc" + finish_gate_caption: "Thêm một cổng có ngày kết thúc của giai đoạn" projects: - missing_dependencies: "Mô-đun dự án %{module} đã được kiểm tra và phụ thuộc vào %{dependencies}. Bạn cần kiểm tra các phụ thuộc này cũng vậy." - section_new_projects: "Cài đặt cho các dự án mới" + missing_dependencies: "Mô-đun dự án %{module} đã được kiểm tra, điều này phụ thuộc vào %{dependencies}. Bạn cũng cần kiểm tra những phụ thuộc này." + section_new_projects: "Cài đặt cho dự án mới" section_project_overview: "Cài đặt cho danh sách dự án" - session: "Phiên làm việc" + session: "Phiên" user: default_preferences: "Cấu hình mặc định" display_format: "Định dạng hiển thị" deletion: "Xóa" working_days: - section_work_week: "Tuần làm việc" - section_holidays_and_closures: "Ngày nghỉ và đóng cửa" + section_work_week: "tuần làm việc" + section_holidays_and_closures: "Ngày lễ và đóng cửa" work_packages: - not_allowed_text: "You do not have the necessary permissions to view this page." + not_allowed_text: "Bạn không có quyền cần thiết để xem trang này." activities: - enable_internal_comments: "Enable internal comments" - helper_text: "Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. %{link}" + enable_internal_comments: "Bật nhận xét nội bộ" + helper_text: "Nhận xét nội bộ cho phép một nhóm nội bộ liên lạc riêng tư với nhau. Những quyền này chỉ hiển thị với những vai trò được chọn có các quyền cần thiết và sẽ không hiển thị công khai. %{link}" text_formatting: markdown: "Gạch dưới" plain: "Văn bản thuần" - status_active: "đang hoạt động" + status_active: "Đang hoạt động" status_archived: "đã lưu trữ" status_blocked: "bị chặn" - status_invited: được mời - status_locked: đã khóa + status_invited: Đã mời + status_locked: bị khóa status_registered: đã đăng ký status_deleted: đã xóa #Used in array.to_sentence. @@ -4572,144 +4645,145 @@ vi: array: sentence_connector: "và" skip_last_comma: "sai" - text_accessibility_hint: "Chế độ truy cập được thiết kế cho người dùng khiếm thị, khuyết tật vận động hoặc thị lực kém. Đối với những người có thị lực kém, các yếu tố được tập trung sẽ được làm nổi bật đặc biệt. Vui lòng lưu ý, mô-đun Backlogs không có sẵn trong chế độ này." - text_access_token_hint: "Mã truy cập cho phép bạn cấp quyền cho các ứng dụng bên ngoài truy cập tài nguyên trong OpenProject." - text_analyze: "Phân tích thêm: %{subject}" + text_accessibility_hint: "Chế độ trợ năng được thiết kế dành cho người dùng bị mù, khuyết tật vận động hoặc có thị lực kém. Đối với các yếu tố tập trung sau này được đánh dấu đặc biệt. Xin lưu ý rằng mô-đun Backlogs không khả dụng ở chế độ này." + text_access_token_hint: "Mã thông báo truy cập cho phép bạn cấp cho các ứng dụng bên ngoài quyền truy cập vào tài nguyên trong OpenProject." + text_analyze: "Phân tích sâu hơn: %{subject}" text_are_you_sure: "Bạn có chắc không?" - open_link_in_a_new_tab: "Open link in a new tab" + open_link_in_a_new_tab: "Mở liên kết trong tab mới" text_are_you_sure_continue: "Bạn có chắc chắn muốn tiếp tục không?" text_are_you_sure_with_children: "Xóa gói công việc và tất cả các gói công việc con?" - text_are_you_sure_with_project_custom_fields: "Xóa thuộc tính này cũng sẽ xóa các giá trị của nó trong tất cả các dự án. Bạn có chắc chắn muốn làm điều này không?" - text_are_you_sure_with_project_life_cycle_step: "Deleting this phase will also delete its usages in all projects. Are you sure you want to do this?" - text_assign_to_project: "Gán cho dự án" + text_are_you_sure_with_project_custom_fields: "Xóa thuộc tính này cũng sẽ xóa các giá trị của nó trong tất cả các dự án. Bạn có chắc chắn muốn làm điều này?" + text_are_you_sure_with_project_life_cycle_step: "Xóa giai đoạn này cũng sẽ xóa việc sử dụng nó trong tất cả các dự án. Bạn có chắc chắn muốn làm điều này?" + text_assign_to_project: "Giao cho dự án" text_form_configuration: > Bạn có thể tùy chỉnh các trường sẽ được hiển thị trong các gói công việc. Bạn có thể tự do nhóm các trường để phản ánh nhu cầu cho tên miền của bạn. text_form_configuration_required_attribute: "Thuộc tính được đánh dấu là bắt buộc và do đó luôn được hiển thị" - text_caracters_maximum: "Tối đa %{count} ký tự." - text_caracters_minimum: "Ít nhất phải có %{count} ký tự." - text_comma_separated: "Nhiều giá trị được phép (ngăn cách bằng dấu phẩy)." + text_caracters_maximum: "tối đa %{count} ký tự." + text_caracters_minimum: "Phải dài ít nhất %{count} ký tự." + text_comma_separated: "Cho phép nhiều giá trị (được phân tách bằng dấu phẩy)." text_comment_wiki_page: "Bình luận cho trang wiki: %{page}" text_custom_field_possible_values_info: "Một dòng cho mỗi giá trị" text_custom_field_hint_activate_per_project: > - Khi sử dụng các trường tùy chỉnh: Hãy nhớ rằng các trường tùy chỉnh cần được kích hoạt theo từng dự án. + Khi sử dụng trường tùy chỉnh: Hãy nhớ rằng các trường tùy chỉnh cũng cần được kích hoạt cho mỗi dự án. text_custom_field_hint_activate_per_project_and_type: > - Các trường tùy chỉnh cần được kích hoạt theo loại gói công việc và theo từng dự án. + Các trường tùy chỉnh cần được kích hoạt cho mỗi loại gói công việc và mỗi dự án. text_project_custom_field_html: > Phiên bản Enterprise sẽ thêm các phần bổ sung cho các trường tùy chỉnh của dự án:
    • Thêm các trường tùy chỉnh cho dự án vào danh sách Dự án của bạn để tạo cái nhìn tổng quan về danh mục dự án
    text_custom_logo_instructions: > - The logo automatically scales to fit the header. For best results, upload a white logo on a transparent 130×47px image. You can add as much spacing inside that image as you like. + Logo tự động chia tỷ lệ để vừa với tiêu đề. Để có kết quả tốt nhất, hãy tải lên biểu tượng màu trắng trên hình ảnh trong suốt có kích thước 130×47px. Bạn có thể thêm bao nhiêu khoảng cách bên trong hình ảnh đó tùy thích. text_custom_logo_mobile_instructions: > - The logo automatically scales to fit the header. For best results, upload a white logo on a transparent 130×33px image. You can add as much spacing inside that image as you like. + Logo tự động chia tỷ lệ để vừa với tiêu đề. Để có kết quả tốt nhất, hãy tải lên biểu tượng màu trắng trên hình ảnh trong suốt có kích thước 130×33px. Bạn có thể thêm bao nhiêu khoảng cách bên trong hình ảnh đó tùy thích. text_custom_export_logo_instructions: > - Đây là logo xuất hiện trong các bản xuất PDF của bạn. Nó cần phải là tệp hình ảnh PNG hoặc JPEG. Logo màu đen hoặc có màu trên nền trong suốt hoặc trắng được khuyến nghị. + Đây là logo xuất hiện trong bản xuất PDF của bạn. Nó cần phải là tệp hình ảnh PNG hoặc JPEG. Nên sử dụng biểu tượng màu đen hoặc màu trên nền trong suốt hoặc trắng. text_custom_export_cover_instructions: > - Đây là hình ảnh xuất hiện trên nền của trang bìa trong các bản xuất PDF của bạn. Nó cần phải là tệp hình ảnh PNG hoặc JPEG có kích thước khoảng 800px chiều rộng x 500px chiều cao. + Đây là hình ảnh xuất hiện dưới nền trang bìa trong bản xuất PDF của bạn. Nó cần phải có kích thước tệp hình ảnh PNG hoặc JPEG có chiều rộng khoảng 800px x chiều cao khoảng 500px. text_custom_export_footer_instructions: > - PDF exports will include a graphical element positioned to the left of the footer. This image must be a PNG or JPEG file with approximately 200 pixels in width. + Xuất PDF sẽ bao gồm một phần tử đồ họa được đặt ở bên trái chân trang. Hình ảnh này phải là tệp PNG hoặc JPEG có chiều rộng khoảng 200 pixel. label_custom_export_font_instructions: > - Upload and manage custom TrueType (.ttf) fonts used in your PDF exports. For best results, use matching files from the same font family. If no font is provided, the default NotoSans font will be used. + Tải lên và quản lý phông chữ TrueType (.ttf) tùy chỉnh được sử dụng trong bản xuất PDF của bạn. Để có kết quả tốt nhất, hãy sử dụng các tệp phù hợp từ cùng một họ phông chữ. Nếu không có phông chữ nào được cung cấp thì phông chữ NotoSans mặc định sẽ được sử dụng. label_custom_export_images_instructions: > - Upload and manage custom image files used in your PDF exports. + Tải lên và quản lý các tệp hình ảnh tùy chỉnh được sử dụng trong bản xuất PDF của bạn. text_custom_export_font_regular_instructions: > - This is the font file for regular text. It needs to be in TTF format and is required. + Đây là tập tin phông chữ cho văn bản thông thường. Nó cần phải ở định dạng TTF và được yêu cầu. text_custom_export_font_bold_instructions: > - This is the font file for bold text. It needs to be in TTF format. + Đây là tập tin phông chữ cho văn bản in đậm. Nó cần phải ở định dạng TTF. text_custom_export_font_italic_instructions: > - This is the font file for italic text. It needs to be in TTF format. + Đây là tập tin phông chữ cho văn bản in nghiêng. Nó cần phải ở định dạng TTF. text_custom_export_font_bold_italic_instructions: > - This is the font file for bold and italic text. It needs to be in TTF format. + Đây là tập tin phông chữ cho văn bản in đậm và in nghiêng. Nó cần phải ở định dạng TTF. text_custom_favicon_instructions: > - Đây là biểu tượng nhỏ xuất hiện trên cửa sổ/tab trình duyệt của bạn bên cạnh tiêu đề trang. Nó cần phải là tệp hình ảnh PNG có kích thước vuông 32 x 32 pixels với nền trong suốt. + Đây là biểu tượng nhỏ xuất hiện trong cửa sổ/tab trình duyệt của bạn bên cạnh tiêu đề trang. Nó phải là tệp hình ảnh PNG bình phương có kích thước 32 x 32 pixel với nền trong suốt. text_custom_touch_icon_instructions: > - Đây là biểu tượng xuất hiện trên thiết bị di động hoặc máy tính bảng của bạn khi bạn đặt một dấu trang trên màn hình chính của bạn. Nó cần phải là tệp hình ảnh PNG có kích thước vuông 180 x 180 pixels. Vui lòng đảm bảo nền của hình ảnh không trong suốt, nếu không nó sẽ trông không đẹp trên iOS. + Đây là biểu tượng xuất hiện trên điện thoại di động hoặc máy tính bảng của bạn khi bạn đặt dấu trang trên màn hình chính. Nó phải là tệp hình ảnh PNG có kích thước 180 x 180 pixel bình phương. Vui lòng đảm bảo nền của hình ảnh không trong suốt, nếu không nó sẽ trông xấu trên iOS. text_database_allows_tsv: "Tùy chọn cho phép TSVector của Database" text_default_administrator_account_changed: "Tài khoản quản trị viên mặc định đã thay đổi" text_default_encoding: "Mặc định: UTF-8" - text_destroy: "Xoá" - text_destroy_with_associated: "Có các đối tượng bổ sung liên kết với gói công việc(s) mà sẽ bị xóa. Các đối tượng đó thuộc loại sau:" + text_destroy: "xóa" + text_destroy_with_associated: "Có các đối tượng bổ sung liên quan đến (các) gói công việc sẽ bị xóa. Các đối tượng đó có các loại sau:" text_destroy_what_to_do: "Bạn muốn làm gì?" text_diff_truncated: "... Sự khác biệt này đã bị cắt bớt vì nó vượt quá kích thước tối đa có thể được hiển thị." text_email_delivery_not_configured: "Gửi email không được cấu hình và thông báo bị vô hiệu hóa.\nCấu hình máy chủ SMTP của bạn để kích hoạt chúng." - text_enumeration_category_reassign_to: "Gán lại cho giá trị này:" - text_enumeration_destroy_question: "%{count} đối tượng đã được gán cho giá trị này." - text_file_repository_writable: "Thư mục đính kèm có thể ghi được" - text_git_repo_example: "một kho lưu trữ bare và local (ví dụ: /gitrepo, c:\\gitrepo)" - text_hint_date_format: "Nhập một ngày theo định dạng YYYY-MM-DD. Các định dạng khác có thể được chuyển đổi thành ngày không mong muốn." - text_hint_disable_with_0: "Lưu ý: Vô hiệu hóa với 0" + text_enumeration_category_reassign_to: "Gán lại chúng cho giá trị này:" + text_enumeration_destroy_question: "Các đối tượng %{count} được gán cho giá trị này." + text_file_repository_writable: "Thư mục đính kèm có thể ghi" + text_git_repo_example: "một kho lưu trữ trống và cục bộ (trong /git repo, c:\\git repo)" + text_hint_date_format: "Nhập ngày ở dạng YYYY-MM-DD. Các định dạng khác có thể được thay đổi thành ngày không mong muốn." + text_hint_disable_with_0: "Lưu ý: Vô hiệu hóa bằng 0" text_hours_between: "Giữa %{min} và %{max} giờ." text_work_package_added: "Gói công việc %{id} đã được báo cáo bởi %{author}." - text_work_package_category_destroy_assignments: "Gỡ bỏ gán danh mục" - text_work_package_category_destroy_question: "Một số gói công việc (%{count}) đã được gán cho danh mục này. Bạn muốn làm gì?" + text_work_package_category_destroy_assignments: "Xóa bài tập danh mục" + text_work_package_category_destroy_question: "Một số gói công việc (%{count}) được gán cho danh mục này. Bạn muốn làm gì?" text_work_package_category_reassign_to: "Gán lại các gói công việc cho danh mục này" text_work_package_updated: "Gói công việc %{id} đã được cập nhật bởi %{author}." - text_work_package_watcher_added: "Bạn đã được thêm vào danh sách theo dõi Gói công việc %{id} bởi %{watcher_changer}." - text_work_package_watcher_removed: "Bạn đã bị xóa khỏi danh sách theo dõi Gói công việc %{id} bởi %{watcher_changer}." - text_work_packages_destroy_confirmation: "Bạn có chắc chắn muốn xóa các gói công việc(s) đã chọn không?" - text_work_packages_ref_in_commit_messages: "Tham chiếu và sửa các gói công việc trong các thông điệp cam kết" - text_journal_added: "%{label} %{value} đã được thêm" - text_journal_attachment_added: "%{label} %{value} đã được thêm dưới dạng đính kèm" - text_journal_attachment_deleted: "%{label} %{old} đã bị xóa dưới dạng đính kèm" - text_journal_changed_plain: "%{label} đã thay đổi từ %{old} %{linebreak} đến %{new}" - text_journal_changed_no_detail: "%{label} đã được cập nhật" + text_work_package_watcher_added: "Bạn đã được thêm làm người theo dõi gói Công việc %{id} bởi %{watcher_changer}." + text_work_package_watcher_removed: "Bạn đã bị %{watcher_changer} xóa khỏi danh sách người theo dõi gói Công việc %{id}." + text_work_packages_destroy_confirmation: "Bạn có chắc chắn muốn xóa (các) gói công việc đã chọn không?" + text_work_packages_ref_in_commit_messages: "Tham khảo và sửa các gói công việc trong thông báo cam kết" + text_journal_added: "%{label} %{value} đã thêm" + text_journal_attachment_added: "%{label} %{value} được thêm dưới dạng tệp đính kèm" + text_journal_attachment_deleted: "%{label} %{old} đã bị xóa dưới dạng tệp đính kèm" + text_journal_changed_plain: "%{label} đã thay đổi từ %{old} %{linebreak}thành %{new}" + text_journal_changed_no_detail: "%{label} đã cập nhật" text_journal_changed_with_diff: "%{label} đã thay đổi (%{link})" - text_journal_deleted: "%{label} đã bị xóa (%{old})" + text_journal_deleted: "%{label} đã xóa (%{old})" text_journal_deleted_subproject: "%{label} %{old}" - text_journal_deleted_with_diff: "%{label} đã bị xóa (%{link})" - text_journal_file_link_added: "%{label} liên kết đến %{value} (%{storage}) đã được thêm" - text_journal_file_link_deleted: "%{label} liên kết đến %{old} (%{storage}) đã bị xóa" + text_journal_deleted_with_diff: "%{label} đã xóa (%{link})" + text_journal_file_link_added: "Đã thêm %{label} liên kết tới %{value} (%{storage})" + text_journal_file_link_deleted: "%{label} liên kết tới %{old} (%{storage}) đã bị xóa" text_journal_of: "%{label} %{value}" - text_journal_set_to: "%{label} đã được đặt thành %{value}" - text_journal_set_with_diff: "%{label} đã được đặt (%{link})" + text_journal_set_to: "%{label} được đặt thành %{value}" + text_journal_set_with_diff: "%{label} đặt (%{link})" text_journal_label_value: "%{label} %{value}" - text_latest_note: "Nhận xét mới nhất là: %{note}" - text_length_between: "Độ dài giữa %{min} và %{max} ký tự." - text_line_separated: "Nhiều giá trị được phép (mỗi giá trị trên một dòng)." + text_latest_note: "Bình luận mới nhất là: %{note}" + text_length_between: "Độ dài từ %{min} đến %{max} ký tự." + text_line_separated: "Cho phép nhiều giá trị (mỗi giá trị một dòng)." text_load_default_configuration: "Tải cấu hình mặc định" - text_min_max_length_info: "0 có nghĩa là không có hạn chế" - text_no_roles_defined: Chưa có vai trò nào được định nghĩa. - text_no_access_tokens_configurable: "Chưa có mã truy cập nào có thể được cấu hình." - text_no_configuration_data: "Vai trò, loại, trạng thái gói công việc và quy trình làm việc chưa được cấu hình.\nRất khuyến khích bạn tải cấu hình mặc định. Bạn sẽ có thể chỉnh sửa sau khi tải xong." - text_no_notes: "Không có nhận xét nào cho gói công việc này." - text_notice_too_many_values_are_inperformant: "Lưu ý: Hiển thị hơn 100 mục mỗi trang có thể làm tăng thời gian tải trang." + text_min_max_length_info: "0 có nghĩa là không hạn chế" + text_no_roles_defined: Không có vai trò nào được xác định. + text_no_access_tokens_configurable: "Không có mã thông báo truy cập nào có thể được cấu hình." + text_no_configuration_data: "Vai trò, loại, trạng thái gói công việc và quy trình làm việc chưa được định cấu hình.\nRất khuyến khích tải cấu hình mặc định. Bạn sẽ có thể sửa đổi nó sau khi tải." + text_no_notes: "Không có bình luận nào cho gói công việc này." + text_notice_too_many_values_are_inperformant: "Lưu ý: Hiển thị hơn 100 mục trên mỗi trang có thể làm tăng thời gian tải trang." text_notice_security_badge_displayed_html: > Lưu ý: nếu được kích hoạt, một bảng thông báo về tình trạng của phần mềm sẽ được hiển thị tại trang quản trị %{information_panel_label}, và tại trang chủ. Thông tin này chỉ được thấy bởi Quản trị viên.
    Bảng thông báo sẽ kiểm tra các thông tin cập nhật từ OpenProject và thông báo về các cập nhật mới hay các lỗi được phát hiện. Để biết thêm chi tiết, vui lòng tham khảo tài liệu cấu hình. - text_own_membership_delete_confirmation: "Bạn sắp xóa một số hoặc tất cả quyền của mình và có thể không còn khả năng chỉnh sửa dự án này sau đó.\nBạn có chắc chắn muốn tiếp tục không?" - text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" - text_plugin_assets_writable: "Thư mục tài sản plugin có thể ghi được" + text_own_membership_delete_confirmation: "Bạn sắp xóa một số hoặc tất cả các quyền của mình và sau đó có thể không chỉnh sửa được dự án này nữa.\nBạn có chắc chắn muốn tiếp tục không?" + text_permanent_delete_confirmation_checkbox_label: "Tôi hiểu rằng việc xóa này không thể đảo ngược" + text_permanent_remove_confirmation_checkbox_label: "Tôi hiểu rằng việc xóa này không thể hoàn tác được" + text_plugin_assets_writable: "Thư mục nội dung plugin có thể ghi" text_powered_by: "Được cung cấp bởi %{link}" - text_project_identifier_info: "Chỉ cho phép chữ cái viết thường (a-z), số, dấu gạch ngang và gạch dưới, phải bắt đầu bằng chữ cái viết thường." - text_reassign: "Gán lại cho gói công việc:" - text_regexp_info: "ví dụ: ^[A-Z0-9]+$" + text_project_identifier_info: "Chỉ cho phép chữ cái viết thường (a-z), số, dấu gạch ngang và dấu gạch dưới, phải bắt đầu bằng chữ cái viết thường." + text_reassign: "Phân công lại cho gói công việc:" + text_regexp_info: "ví dụ. ^[A-Z0-9]+$" text_regexp_multiline: 'Biểu thức được áp dụng ở chế độ đa dòng. Ví dụ: ^---\s+' - text_repository_usernames_mapping: "Chọn hoặc cập nhật người dùng OpenProject được ánh xạ với từng tên người dùng tìm thấy trong nhật ký kho lưu trữ.\nNgười dùng với cùng tên người dùng hoặc email OpenProject và kho lưu trữ sẽ được ánh xạ tự động." - text_status_changed_by_changeset: "Áp dụng trong thay đổi %{value}." - text_table_difference_description: "Trong bảng này, các mục đơn %{entries} được hiển thị. Bạn có thể xem sự khác biệt giữa bất kỳ hai mục nào bằng cách chọn các hộp kiểm tương ứng trong bảng trước. Khi nhấp vào nút bên dưới bảng, các sự khác biệt sẽ được hiển thị." - text_time_logged_by_changeset: "Áp dụng trong thay đổi %{value}." - text_tip_work_package_begin_day: "gói công việc bắt đầu vào ngày này" - text_tip_work_package_begin_end_day: "gói công việc bắt đầu và kết thúc vào ngày này" - text_tip_work_package_end_day: "gói công việc kết thúc vào ngày này" - text_type_no_workflow: "Không có quy trình làm việc được định nghĩa cho loại này" + text_repository_usernames_mapping: "Chọn hoặc cập nhật người dùng OpenProject được ánh xạ tới từng tên người dùng được tìm thấy trong nhật ký kho lưu trữ.\nNgười dùng có cùng tên người dùng hoặc email của OpenProject và kho lưu trữ sẽ được tự động ánh xạ." + text_status_changed_by_changeset: "Được áp dụng trong bộ thay đổi %{value}." + text_table_difference_description: "Trong bảng này, đơn %{entries} được hiển thị. Bạn có thể xem sự khác biệt giữa hai mục bất kỳ bằng cách trước tiên chọn các hộp kiểm tương ứng trong bảng. Khi nhấp vào nút bên dưới bảng, sự khác biệt sẽ được hiển thị." + text_time_logged_by_changeset: "Được áp dụng trong bộ thay đổi %{value}." + text_tip_work_package_begin_day: "gói công việc bắt đầu từ ngày hôm nay" + text_tip_work_package_begin_end_day: "gói công việc bắt đầu và kết thúc ngày hôm nay" + text_tip_work_package_end_day: "gói công việc kết thúc vào ngày hôm nay" + text_type_no_workflow: "Không có quy trình làm việc nào được xác định cho loại này" text_unallowed_characters: "Ký tự không được phép" text_user_invited: Người dùng đã được mời và đang chờ đăng ký. text_user_wrote: "%{value} đã viết:" - text_wrote: "wrote" + text_wrote: "đã viết" text_warn_on_leaving_unsaved: "Gói công việc chứa văn bản chưa được lưu sẽ bị mất nếu bạn rời khỏi trang này." text_what_did_you_change_click_to_add_comment: "Bạn đã thay đổi gì? Kích để thêm ghi chú" text_wiki_destroy_confirmation: "Bạn có chắc chắn muốn xóa wiki này và tất cả nội dung của nó không?" - text_wiki_page_destroy_children: "Xóa các trang con và tất cả các hậu duệ của chúng" - text_wiki_page_destroy_question: "Trang này có %{descendants} trang con(s) và trang cháu(s). Bạn muốn làm gì?" - text_wiki_page_nullify_children: "Giữ các trang con như các trang gốc" - text_wiki_page_reassign_children: "Gán lại các trang con cho trang cha này" - text_workflow_edit: "Chọn một vai trò và một loại để chỉnh sửa quy trình làm việc" + text_wiki_page_destroy_children: "Xóa các trang con và tất cả các trang con của chúng" + text_wiki_page_destroy_question: "Trang này có %{descendants} trang con và trang con. Bạn muốn làm gì?" + text_wiki_page_nullify_children: "Giữ các trang con làm trang gốc" + text_wiki_page_reassign_children: "Gán lại các trang con cho trang mẹ này" + text_workflow_edit: "Chọn vai trò và loại để chỉnh sửa quy trình làm việc" text_zoom_in: "Phóng to" text_zoom_out: "Thu nhỏ" text_setup_mail_configuration: "Cấu hình nhà cung cấp email của bạn" help_texts: views: project: > - %{plural} luôn gắn liền với một dự án. Bạn chỉ có thể chọn các dự án ở đây mà mô-đun %{plural} đang hoạt động. Sau khi tạo một %{singular}, bạn có thể thêm các gói công việc từ các dự án khác vào nó. - public: "Xuất bản chế độ xem này, cho phép người dùng khác truy cập chế độ xem của bạn. Người dùng có quyền 'Quản lý các chế độ xem công khai' có thể chỉnh sửa hoặc xóa truy vấn công khai. Điều này không ảnh hưởng đến khả năng hiển thị của kết quả gói công việc trong chế độ xem đó và tùy thuộc vào quyền của họ, người dùng có thể thấy các kết quả khác nhau." - favoured: "Đánh dấu chế độ xem này là yêu thích và thêm vào thanh bên các chế độ xem đã lưu ở bên trái." + %{plural} luôn gắn liền với một dự án. Ở đây bạn chỉ có thể chọn các dự án có mô-đun %{plural} đang hoạt động. Sau khi tạo %{singular} bạn có thể thêm các gói công việc từ các dự án khác vào đó. + public: "Xuất bản chế độ xem này, cho phép người dùng khác truy cập vào chế độ xem của bạn. Người dùng có quyền 'Quản lý chế độ xem công khai' có thể sửa đổi hoặc xóa truy vấn công khai. Điều này không ảnh hưởng đến khả năng hiển thị của kết quả gói công việc trong chế độ xem đó và tùy thuộc vào quyền của họ, người dùng có thể thấy các kết quả khác nhau." + favoured: "Đánh dấu chế độ xem này là yêu thích và thêm vào thanh bên chế độ xem đã lưu ở bên trái." time: am: "sáng" formats: @@ -4722,142 +4796,142 @@ vi: show: "Hiển thị khung thời gian" end: "đến" start: "từ" - title_remove_and_delete_user: Xóa người dùng đã mời khỏi dự án và xóa người đó. + title_remove_and_delete_user: Xóa người dùng được mời khỏi dự án và xóa anh ấy/cô ấy. title_enterprise_upgrade: "Nâng cấp để mở khóa nhiều người dùng hơn." tooltip_user_default_timezone: > Time zone mặc định, không thể thay bởi thiết lapạ Nsd. tooltip_resend_invitation: > - Gửi một email mời khác với mã mới trong trường hợp mã cũ đã hết hạn hoặc người dùng chưa nhận được email gốc. Cũng có thể được sử dụng cho người dùng đang hoạt động để chọn phương thức xác thực mới. Khi được sử dụng với người dùng đang hoạt động, trạng thái của họ sẽ được thay đổi thành 'đã mời'. + Gửi một email mời khác kèm theo mã thông báo mới trong trường hợp email cũ hết hạn hoặc người dùng không nhận được email gốc. Cũng có thể được sử dụng để người dùng đang hoạt động chọn phương thức xác thực mới. Khi được sử dụng với người dùng đang hoạt động, trạng thái của họ sẽ được thay đổi thành 'được mời'. tooltip: setting_email_login: > - Nếu được kích hoạt, người dùng sẽ không thể chọn đăng nhập trong quá trình đăng ký. Thay vào đó, địa chỉ email của họ sẽ được sử dụng làm đăng nhập. Một quản trị viên vẫn có thể thay đổi đăng nhập một cách riêng biệt. + Nếu được bật, người dùng sẽ không thể chọn đăng nhập trong khi đăng ký. Thay vào đó, địa chỉ email đã cung cấp của họ sẽ dùng làm thông tin đăng nhập. Quản trị viên vẫn có thể thay đổi thông tin đăng nhập riêng. queries: - apply_filter: Áp dụng bộ lọc đã cấu hình sẵn + apply_filter: Áp dụng bộ lọc được cấu hình sẵn configure_view: - heading: Cấu hình chế độ xem + heading: Định cấu hình chế độ xem columns: input_label: "Thêm cột" input_placeholder: "Chọn một cột" drag_area_label: "Quản lý và sắp xếp lại các cột" sort_by: automatic: - heading: "Tự động" - description: "Sắp xếp %{plural} theo một hoặc nhiều tiêu chí sắp xếp. Bạn sẽ mất sắp xếp trước đó." + heading: "tự động" + description: "Sắp xếp %{plural} theo một hoặc nhiều tiêu chí sắp xếp. Bạn sẽ mất việc sắp xếp trước đó." top_menu: additional_resources: "Tài nguyên bổ sung" getting_started: "Bắt đầu" help_and_support: "Trợ giúp và hỗ trợ" - total_progress: "Tiến độ tổng thể" + total_progress: "Tổng tiến độ" user: all: "tất cả" - active: "đang hoạt động" - activate: "Kích hoạt" - activate_and_reset_failed_logins: "Kích hoạt và đặt lại các lần đăng nhập không thành công" + active: "Đang hoạt động" + activate: "kích hoạt" + activate_and_reset_failed_logins: "Kích hoạt và đặt lại thông tin đăng nhập thất bại" authentication_provider: "Nhà cung cấp xác thực" - identity_url_text: "Mã định danh duy nhất nội bộ do nhà cung cấp xác thực cung cấp." + identity_url_text: "Mã định danh duy nhất nội bộ do nhà cung cấp dịch vụ xác thực cung cấp." authentication_settings_disabled_due_to_external_authentication: > - Người dùng này xác thực qua nhà cung cấp xác thực bên ngoài, vì vậy không có mật khẩu trong OpenProject để thay đổi. + Người dùng này xác thực thông qua nhà cung cấp xác thực bên ngoài, do đó không có mật khẩu nào trong OpenProject cần thay đổi. authorization_rejected: "Bạn không được phép đăng nhập." - assign_random_password: "Gán mật khẩu ngẫu nhiên (gửi qua email cho người dùng)" - blocked: "khóa tạm thời" + assign_random_password: "Gán mật khẩu ngẫu nhiên (gửi cho người dùng qua email)" + blocked: "bị khóa tạm thời" blocked_num_failed_logins: other: "bị khóa tạm thời (%{count} lần đăng nhập không thành công)" - confirm_status_change: "Bạn sắp thay đổi trạng thái của '%{name}'. Bạn có chắc chắn muốn tiếp tục không?" + confirm_status_change: "Bạn sắp thay đổi trạng thái '%{name}'. Bạn có chắc chắn muốn tiếp tục không?" deleted: "Người dùng đã bị xóa" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "Bạn không thể thay đổi trạng thái người dùng của riêng bạn." + error_admin_change_on_non_admin: "Chỉ quản trị viên mới có thể thay đổi trạng thái của người dùng quản trị viên." error_status_change_failed: "Thay đổi trạng thái người dùng không thành công do các lỗi sau: %{errors}" invite: Mời người dùng qua email - invited: được mời + invited: Đã mời lock: "Khóa vĩnh viễn" - locked: "khóa vĩnh viễn" - no_login: "Người dùng này xác thực qua đăng nhập bằng mật khẩu. Vì nó đã bị vô hiệu hóa, họ không thể đăng nhập." + locked: "bị khóa vĩnh viễn" + no_login: "Người dùng này xác thực thông qua đăng nhập bằng mật khẩu. Vì nó bị vô hiệu hóa nên họ không thể đăng nhập." password_change_unsupported: Thay đổi mật khẩu không được hỗ trợ. registered: "đã đăng ký" - reset_failed_logins: "Đặt lại các lần đăng nhập không thành công" + reset_failed_logins: "Đặt lại thông tin đăng nhập thất bại" status_user_and_brute_force: "%{user} và %{brute_force}" status_change: "Thay đổi trạng thái" text_change_disabled_for_provider_login: "Tên được thiết lập với người cung cấp đăng nhập của bạn và vì thế không thể thay đổi" - text_change_disabled_for_ldap_login: "Tên và email được thiết lập bởi LDAP và do đó không thể thay đổi." + text_change_disabled_for_ldap_login: "Tên và email do LDAP đặt và do đó không thể thay đổi." unlock: "Mở khoá" - unlock_and_reset_failed_logins: "Mở khóa và đặt lại các lần đăng nhập không thành công" - version_status_closed: "đã đóng" - version_status_locked: "khóa" + unlock_and_reset_failed_logins: "Mở khóa và đặt lại thông tin đăng nhập thất bại" + version_status_closed: "đóng cửa" + version_status_locked: "bị khóa" version_status_open: "mở" - note: Ghi chú + note: Lưu ý note_password_login_disabled: "Đăng nhập bằng mật khẩu đã bị vô hiệu hóa bởi %{configuration}." warning: Cảnh báo - warning_attachments_not_saved: "Không thể lưu %{count} tệp(s)." + warning_attachments_not_saved: "%{count} tệp không thể lưu được." warning_imminent_user_limit: > Bạn đã mời nhiều người dùng hơn số lượng được hỗ trợ bởi gói hiện tại của bạn. Những người dùng được mời có thể không thể tham gia vào môi trường OpenProject của bạn. Vui lòng nâng cấp gói của bạn hoặc khóa người dùng hiện tại để cho phép người dùng được mời và đã đăng ký tham gia. warning_registration_token_expired: | Mail kích hoạt đã hết hạn. Sẽ gửi mail mới tới %{email}. warning_user_limit_reached: > - Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng để đảm bảo người dùng bên ngoài có thể truy cập vào phiên bản này. + Việc thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng nhằm đảm bảo người dùng bên ngoài có thể truy cập phiên bản này. warning_user_limit_reached_admin: > Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng nâng cấp gói của bạn để đảm bảo người dùng bên ngoài có thể truy cập vào phiên bản này. warning_user_limit_reached_instructions: > - Bạn đã đạt đến giới hạn người dùng của mình (%{current}/%{max} người dùng hoạt động). Vui lòng liên hệ với sales@openproject.com để nâng cấp gói Enterprise của bạn và thêm người dùng bổ sung. + Bạn đã đạt đến giới hạn người dùng của mình (%{current}/%{max} người dùng đang hoạt động). Vui lòng liên hệ sales@openproject.com để nâng cấp gói phiên bản Enterprise của bạn và thêm người dùng bổ sung. warning_protocol_mismatch_html: > warning_bar: https_mismatch: - title: "Không khớp cấu hình chế độ HTTPS" + title: "Thiết lập chế độ HTTPS không khớp" text_html: > Ứng dụng của bạn đang chạy với chế độ HTTPS được đặt thành %{set_protocol}, nhưng yêu cầu là một yêu cầu %{actual_protocol}. Điều này sẽ gây ra lỗi! Bạn sẽ cần thiết lập giá trị cấu hình sau: %{setting_value}. Vui lòng xem tài liệu cài đặt về cách thiết lập cấu hình này. hostname_mismatch: title: "Giao thức cài đặt không khớp" text_html: > Ứng dụng của bạn đang chạy với cài đặt tên máy chủ được đặt thành %{set_hostname}, nhưng yêu cầu là %{actual_hostname} máy chủ . Điều này sẽ dẫn đến lỗi! Truy cập Cài đặt hệ thống và thay đổi cài đặt "Tên máy chủ" để sửa lỗi này. - menu_item: "Mục menu" - menu_item_setting: "Hiển thị" + menu_item: "Mục thực đơn" + menu_item_setting: "Khả năng hiển thị" wiki_menu_item_for: 'Mục menu cho trang wiki "%{title}"' - wiki_menu_item_setting: "Hiển thị" + wiki_menu_item_setting: "Khả năng hiển thị" wiki_menu_item_new_main_item_explanation: > - Bạn đang xóa mục menu chính wiki duy nhất. Bạn cần chọn một trang wiki để tạo một mục chính mới. Để xóa wiki, mô-đun wiki có thể được vô hiệu hóa bởi các quản trị viên dự án. + Bạn đang xóa mục menu wiki chính duy nhất. Bây giờ bạn phải chọn một trang wiki để tạo một mục chính mới. Để xóa wiki, quản trị viên dự án có thể vô hiệu hóa mô-đun wiki. wiki_menu_item_delete_not_permitted: Không thể xóa mục menu wiki của trang wiki duy nhất. #TODO: merge with work_packages top level key work_package: updated_automatically_by_child_changes: | - _Được cập nhật tự động khi thay đổi giá trị trong gói công việc con %{child}_ + _Được cập nhật tự động bằng cách thay đổi các giá trị trong gói công việc con %{child}_ destroy: - info: "Xóa gói công việc là hành động không thể hoàn tác." + info: "Xóa gói công việc là một hành động không thể thay đổi được." title: "Xóa gói công việc" progress: label_note: "Ghi chú:" modal: - work_based_help_text: "Mỗi trường sẽ được tự động tính toán dựa trên hai trường còn lại khi có thể." - status_based_help_text: "% Hoàn thành được thiết lập theo trạng thái của gói công việc." - migration_warning_text: "Trong chế độ tính toán tiến độ dựa trên công việc, % Hoàn thành không thể được đặt thủ công và liên kết với Công việc. Giá trị hiện tại đã được giữ nhưng không thể chỉnh sửa. Vui lòng nhập Công việc trước." + work_based_help_text: "Mỗi trường được tự động tính toán từ hai trường còn lại khi có thể." + status_based_help_text: "% Hoàn thành được đặt theo trạng thái gói công việc." + migration_warning_text: "Trong chế độ tính toán tiến độ dựa trên công việc, % Hoàn thành không thể được đặt thủ công và được gắn với Công việc. Giá trị hiện tại đã được giữ nhưng không thể chỉnh sửa. Vui lòng nhập Công việc trước." derivation_hints: done_ratio: - cleared_because_remaining_work_is_empty: "Đã xóa vì công việc còn lại đang trống." + cleared_because_remaining_work_is_empty: "Đã xóa vì Công việc còn lại trống." cleared_because_work_is_0h: "Đã xóa vì Công việc là 0h." - derived: "Được suy ra từ Công và Công còn lại." + derived: "Bắt nguồn từ Công việc và Công việc còn lại." estimated_hours: - cleared_because_remaining_work_is_empty: "Đã xóa vì công việc còn lại đang trống." - derived: "Được lấy từ Công việc còn lại và % Hoàn thành." - same_as_remaining_work: "Đặt thành giá trị giống với Công việc còn lại." + cleared_because_remaining_work_is_empty: "Đã xóa vì Công việc còn lại trống." + derived: "Bắt nguồn từ Công việc còn lại và % Hoàn thành." + same_as_remaining_work: "Đặt thành cùng giá trị với Công việc còn lại." remaining_hours: - cleared_because_work_is_empty: "Đã xóa vì Công việc đang trống." - cleared_because_percent_complete_is_empty: "Đã xóa vì % Hoàn thành đang trống." - decreased_by_delta_like_work: "Giảm %{delta}, phù hợp với mức giảm trong Công việc." - derived: "Được lấy từ Công việc và % Hoàn thành." - increased_by_delta_like_work: "Tăng thêm %{delta}, tương ứng với mức tăng của Công việc." - same_as_work: "Đặt thành giá trị giống như Work." + cleared_because_work_is_empty: "Đã xóa vì Công việc trống." + cleared_because_percent_complete_is_empty: "Đã xóa vì % Hoàn thành trống." + decreased_by_delta_like_work: "Đã giảm %{delta}, phù hợp với mức giảm Công việc." + derived: "Bắt nguồn từ Công việc và % Hoàn thành." + increased_by_delta_like_work: "Tăng thêm %{delta}, tương ứng với mức tăng trong Công việc." + same_as_work: "Đặt thành cùng giá trị với Công việc." permissions: - comment: "Nhận xét" + comment: "bình luận" comment_description: "Có thể xem và nhận xét gói công việc này." edit: "Chỉnh sửa" - edit_description: "Có thể xem, nhận xét và chỉnh sửa gói công việc này." - view: "Khung nhìn" + edit_description: "Có thể xem, bình luận và chỉnh sửa gói công việc này." + view: "lượt xem" view_description: "Có thể xem gói công việc này." reminders: - label_remind_at: "Ngày" - note_placeholder: "Why are you setting this reminder?" - create_success_message: "Reminder set successfully. You will receive a notification for this work package %{reminder_time}." - success_update_message: "Reminder updated successfully." - success_deletion_message: "Reminder deleted successfully." + label_remind_at: "ngày" + note_placeholder: "Tại sao bạn đặt lời nhắc này?" + create_success_message: "Đã đặt lời nhắc thành công. Bạn sẽ nhận được thông báo về gói công việc này %{reminder_time}." + success_update_message: "Đã cập nhật lời nhắc thành công." + success_deletion_message: "Đã xóa lời nhắc thành công." sharing: count: zero: "0 người dùng" @@ -4868,145 +4942,145 @@ vi: not_project_member: "Không phải thành viên dự án" project_group: "Nhóm dự án" not_project_group: "Không phải nhóm dự án" - user: "Người dùng" - group: "Nhóm" - role: "Vai trò" - type: "Kiểu" + user: "người dùng" + group: "nhóm" + role: "vai trò" + type: "loại" denied: "Bạn không có quyền chia sẻ %{entities}." label_search: "Tìm kiếm người dùng để mời" label_search_placeholder: "Tìm kiếm theo người dùng hoặc địa chỉ email" - label_toggle_all: "Chuyển đổi tất cả chia sẻ" + label_toggle_all: "Chuyển đổi tất cả các chia sẻ" remove: "Xóa" - share: "Chia sẻ" + share: "chia sẻ" text_empty_search_description: "Không có người dùng nào với tiêu chí lọc hiện tại." - text_empty_search_header: "Chúng tôi không tìm thấy kết quả phù hợp." - text_empty_state_description: "Mới đây %{entity} chưa được chia sẻ với bất kỳ ai." + text_empty_search_header: "Chúng tôi không thể tìm thấy bất kỳ kết quả phù hợp." + text_empty_state_description: "%{entity} chưa được chia sẻ với bất kỳ ai." text_empty_state_header: "Không được chia sẻ" - text_user_limit_reached: "Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng để đảm bảo người dùng bên ngoài có thể truy cập vào %{entity} này." + text_user_limit_reached: "Việc thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng nhằm đảm bảo người dùng bên ngoài có thể truy cập %{entity} này." text_user_limit_reached_admins: 'Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng nâng cấp gói của bạn để có thể thêm nhiều người dùng hơn.' warning_user_limit_reached: > - Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng để đảm bảo người dùng bên ngoài có thể truy cập vào %{entity} này. + Việc thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng liên hệ với quản trị viên để tăng giới hạn người dùng nhằm đảm bảo người dùng bên ngoài có thể truy cập %{entity} này. warning_user_limit_reached_admin: > Thêm người dùng bổ sung sẽ vượt quá giới hạn hiện tại. Vui lòng nâng cấp gói của bạn để đảm bảo người dùng bên ngoài có thể truy cập vào %{entity} này. - warning_no_selected_user: "Vui lòng chọn người dùng để chia sẻ %{entity} này" - warning_locked_user: "Người dùng %{user} đã bị khóa và không thể chia sẻ" + warning_no_selected_user: "Vui lòng chọn người dùng để chia sẻ %{entity} này với" + warning_locked_user: "Người dùng %{user} đã bị khóa và không thể chia sẻ với" user_details: locked: "Người dùng bị khóa" - invited: "Lời mời đã được gửi. " + invited: "Đã gửi lời mời." resend_invite: "Gửi lại." invite_resent: "Lời mời đã được gửi lại" - not_project_member: "Không phải thành viên dự án" - project_group: "Các thành viên nhóm có thể có quyền bổ sung (như thành viên dự án)" + not_project_member: "Không phải là thành viên dự án" + project_group: "Thành viên nhóm có thể có các đặc quyền bổ sung (với tư cách là thành viên dự án)" not_project_group: "Nhóm (chia sẻ với tất cả các thành viên)" - additional_privileges_project: "Có thể có quyền bổ sung (như thành viên dự án)" - additional_privileges_group: "Có thể có quyền bổ sung (như thành viên nhóm)" - additional_privileges_project_or_group: "Có thể có quyền bổ sung (như thành viên dự án hoặc nhóm)" + additional_privileges_project: "Có thể có các đặc quyền bổ sung (với tư cách là thành viên dự án)" + additional_privileges_group: "Có thể có thêm đặc quyền (với tư cách là thành viên nhóm)" + additional_privileges_project_or_group: "Có thể có các đặc quyền bổ sung (với tư cách là thành viên dự án hoặc nhóm)" project_queries: publishing_denied: "Bạn không có quyền công khai danh sách dự án." - access_warning: "Người dùng chỉ thấy các dự án mà họ có quyền truy cập. Chia sẻ danh sách dự án không ảnh hưởng đến quyền truy cập của từng dự án." + access_warning: "Người dùng sẽ chỉ nhìn thấy các dự án mà họ có quyền truy cập. Việc chia sẻ danh sách dự án không ảnh hưởng đến quyền của từng dự án." user_details: - owner: "Chủ danh sách" - can_view_because_public: "Có thể xem vì danh sách được chia sẻ với mọi người" + owner: "Chủ sở hữu danh sách" + can_view_because_public: "Đã có thể xem vì danh sách được chia sẻ với mọi người" can_manage_public_lists: "Có thể chỉnh sửa do quyền toàn cầu" public_flag: - label: "Chia sẻ với tất cả mọi người tại %{instance_name}" + label: "Chia sẻ với mọi người tại %{instance_name}" caption: "Mọi người đều có thể xem danh sách dự án này. Những người có quyền chỉnh sửa toàn cầu có thể sửa đổi nó." blank_state: public: - header: "Chia sẻ với tất cả mọi người" - description: "Mọi người đều có thể xem danh sách dự án này. Bạn cũng có thể thêm người dùng cá nhân với quyền bổ sung." + header: "Được chia sẻ với mọi người" + description: "Mọi người đều có thể xem danh sách dự án này. Bạn cũng có thể thêm người dùng cá nhân với các quyền bổ sung." private: - header: "Chưa chia sẻ: Riêng tư" - description: "Danh sách dự án này chưa được chia sẻ với bất kỳ ai. Chỉ bạn có thể truy cập danh sách này." + header: "Không được chia sẻ: Riêng tư" + description: "Danh sách dự án này chưa được chia sẻ với bất kỳ ai. Chỉ có bạn mới có thể truy cập danh sách này." permissions: - view: "Khung nhìn" + view: "lượt xem" view_description: "Có thể xem danh sách dự án này." edit: "Chỉnh sửa" edit_description: "Có thể xem, chia sẻ và chỉnh sửa danh sách dự án này." upsell: - message: "Chia sẻ danh sách dự án với người dùng cá nhân là một tiện ích bổ sung doanh nghiệp." + message: "Chia sẻ danh sách dự án với người dùng cá nhân là một tiện ích bổ sung dành cho doanh nghiệp." working_days: info: > - Days that are not selected are skipped when scheduling work packages and project life cycles (and not included in the day count). These can be overridden at a work-package level. + Những ngày không được chọn sẽ bị bỏ qua khi lên lịch các gói công việc và vòng đời dự án (và không được tính vào số ngày). Chúng có thể được ghi đè ở cấp gói công việc. instance_wide_info: > - Các ngày được thêm vào danh sách dưới đây được coi là không làm việc và bị bỏ qua khi lập kế hoạch gói công việc. + Những ngày được thêm vào danh sách dưới đây được coi là không hoạt động và bị bỏ qua khi lên lịch các gói công việc. change_button: "Thay đổi ngày làm việc" warning: > - Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance. + Việc thay đổi ngày trong tuần được coi là ngày làm việc hay ngày không làm việc có thể ảnh hưởng đến ngày bắt đầu và ngày kết thúc của tất cả các gói công việc và vòng đời trong tất cả các dự án trong trường hợp này. journal_note: changed: _**Ngày làm việc** đã thay đổi (%{changes})._ days: - working: "%{day} hiện là ngày làm việc" - non_working: "%{day} hiện không phải là ngày làm việc" + working: "%{day} hiện đang hoạt động" + non_working: "%{day} hiện không hoạt động" dates: - working: "%{date} hiện là ngày làm việc" - non_working: "%{date} hiện không phải là ngày làm việc" + working: "%{date} hiện đang hoạt động" + non_working: "%{date} hiện không hoạt động" nothing_to_preview: "Không có gì để xem trước" api_v3: attributes: - property: "Thuộc tính" + property: "tài sản" errors: code_400: "Yêu cầu không hợp lệ: %{message}" - code_401: "Bạn cần xác thực để truy cập tài nguyên này." + code_401: "Bạn cần phải được xác thực để truy cập tài nguyên này." code_401_wrong_credentials: "Bạn đã không cung cấp thông tin xác thực chính xác." code_403: "Bạn không được phép truy cập tài nguyên này." - code_404: "Tài nguyên yêu cầu không thể tìm thấy." - code_409: "Không thể cập nhật tài nguyên do xung đột chỉnh sửa." + code_404: "Không thể tìm thấy tài nguyên được yêu cầu." + code_409: "Không thể cập nhật tài nguyên do các sửa đổi xung đột." code_429: "Quá nhiều yêu cầu. Vui lòng thử lại sau." code_500: "Đã xảy ra lỗi nội bộ." - code_500_outbound_request_failure: "Yêu cầu ra ngoài tới tài nguyên khác đã thất bại với mã trạng thái %{status_code}." - code_500_missing_enterprise_token: "Yêu cầu không thể được xử lý do token Doanh nghiệp không hợp lệ hoặc bị thiếu." + code_500_outbound_request_failure: "Yêu cầu gửi đi tới tài nguyên khác không thành công với mã trạng thái %{status_code}." + code_500_missing_enterprise_token: "Không thể xử lý yêu cầu do mã thông báo Doanh nghiệp không hợp lệ hoặc bị thiếu." bad_request: - emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions." - invalid_link: "The link under key '%{key}' is not valid." - links_not_an_object: "_links must be a JSON object." + emoji_reactions_activity_type_not_supported: "Loại hoạt động này không hỗ trợ phản ứng bằng biểu tượng cảm xúc." + invalid_link: "Liên kết dưới khóa '%{key}' không hợp lệ." + links_not_an_object: "_links phải là một đối tượng JSON." conflict: multiple_reminders_not_allowed: |- - You can only set one reminder at a time for a work package. Please delete or update the existing reminder. + Bạn chỉ có thể đặt một lời nhắc mỗi lần cho gói công việc. Vui lòng xóa hoặc cập nhật lời nhắc hiện có. not_found: - work_package: "Gói công việc bạn tìm kiếm không thể tìm thấy hoặc đã bị xóa." - reminder: "The reminder you are looking for cannot be found or has been deleted." + work_package: "Không thể tìm thấy gói công việc bạn đang tìm kiếm hoặc đã bị xóa." + reminder: "Lời nhắc bạn đang tìm kiếm không thể tìm thấy hoặc đã bị xóa." expected: date: "YYYY-MM-DD (chỉ nhận ISO 8601)" - datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (bất kỳ ngày giờ ISO 8601 nào)" - duration: "Thời gian ISO 8601" - invalid_content_type: "Mong đợi CONTENT-TYPE là '%{content_type}' nhưng nhận được '%{actual}'." - invalid_format: "Định dạng không hợp lệ cho thuộc tính '%{property}': Mong đợi định dạng như '%{expected_format}', nhưng nhận được '%{actual}'." - invalid_json: "Yêu cầu không thể được phân tích cú pháp dưới dạng JSON." + datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (bất kỳ ngày giờ ISO 8601 tương thích nào)" + duration: "Thời lượng ISO 8601" + invalid_content_type: "Dự kiến ​​CONTENT-TYPE là '%{content_type}' nhưng lại nhận được '%{actual}'." + invalid_format: "Định dạng không hợp lệ cho thuộc tính '%{property}': Định dạng dự kiến ​​là '%{expected_format}' nhưng lại có '%{actual}'." + invalid_json: "Không thể phân tích cú pháp yêu cầu dưới dạng JSON." invalid_relation: "Mối quan hệ không hợp lệ." - invalid_resource: "Đối với thuộc tính '%{property}', một liên kết như '%{expected}' được mong đợi, nhưng nhận được '%{actual}'." + invalid_resource: "Đối với thuộc tính '%{property}', dự kiến ​​sẽ có một liên kết như '%{expected}' nhưng lại nhận được '%{actual}'." invalid_signal: - embed: "Nhúng yêu cầu của %{invalid} không được hỗ trợ. Các nhúng được hỗ trợ là %{supported}." - select: "Chọn yêu cầu của %{invalid} không được hỗ trợ. Các chọn được hỗ trợ là %{supported}." + embed: "Việc nhúng %{invalid} được yêu cầu không được hỗ trợ. Các phần nhúng được hỗ trợ là %{supported}." + select: "Việc chọn %{invalid} được yêu cầu không được hỗ trợ. Các lựa chọn được hỗ trợ là %{supported}." invalid_user_status_transition: "Trạng thái tài khoản người dùng hiện tại không cho phép thao tác này." - missing_content_type: "chưa được chỉ định" + missing_content_type: "không được chỉ định" missing_property: "Thiếu thuộc tính '%{property}'." - missing_request_body: "Không có phần thân yêu cầu." - missing_or_malformed_parameter: "Tham số truy vấn '%{parameter}' bị thiếu hoặc định dạng không đúng." - multipart_body_error: "Phần thân yêu cầu không chứa các phần multipart mong đợi." + missing_request_body: "Không có nội dung yêu cầu." + missing_or_malformed_parameter: "Tham số truy vấn '%{parameter}' bị thiếu hoặc không đúng định dạng." + multipart_body_error: "Nội dung yêu cầu không chứa các phần gồm nhiều phần như mong đợi." multiple_errors: "Nhiều ràng buộc trường đã bị vi phạm." - unable_to_create_attachment: "Tệp đính kèm không thể được tạo" - unable_to_create_attachment_permissions: "Tệp đính kèm không thể được lưu do thiếu quyền hệ thống tập tin" + unable_to_create_attachment: "Không thể tạo tệp đính kèm" + unable_to_create_attachment_permissions: "Không thể lưu tệp đính kèm do thiếu quyền hệ thống tệp" user: - name_readonly: "The name attribute is read-only. Changes can be written through the attributes firstname and lastname." + name_readonly: "Thuộc tính tên chỉ đọc. Các thay đổi có thể được viết thông qua các thuộc tính firstname và Lastname." render: - context_not_parsable: "Bối cảnh cung cấp không phải là liên kết đến tài nguyên." - unsupported_context: "Tài nguyên được cung cấp không được hỗ trợ làm bối cảnh." + context_not_parsable: "Bối cảnh được cung cấp không phải là một liên kết đến một tài nguyên." + unsupported_context: "Tài nguyên đã cho không được hỗ trợ dưới dạng ngữ cảnh." context_object_not_found: "Không thể tìm thấy tài nguyên được cung cấp làm bối cảnh." validation: - due_date: "Ngày hoàn thành không thể được đặt trên các gói công việc cha." + due_date: "Không thể đặt ngày kết thúc trên các gói công việc gốc." invalid_user_assigned_to_work_package: "Người dùng được chọn không được phép là '%{property}' cho gói công việc này." - start_date: "Ngày bắt đầu không thể được đặt trên các gói công việc cha." + start_date: "Không thể đặt ngày bắt đầu trên các gói công việc gốc." eprops: - invalid_gzip: "là gzip không hợp lệ: %{message}" - invalid_json: "là json không hợp lệ: %{message}" + invalid_gzip: "gzip không hợp lệ: %{message}" + invalid_json: "json không hợp lệ: %{message}" resources: schema: "Lược đồ" undisclosed: - parent: Undisclosed - The parent is invisible because of lacking permissions. - project: Undisclosed - The project is invisible because of lacking permissions. - ancestor: Không công khai - Tổ tiên không hiển thị vì thiếu quyền." - definingProject: Undisclosed - The project is invisible because of lacking permissions. + parent: Không được tiết lộ - Phụ huynh ẩn danh vì thiếu quyền. + project: Không được tiết lộ - Dự án vô hình vì thiếu quyền. + ancestor: Không được tiết lộ - Tổ tiên là vô hình vì thiếu quyền. + definingProject: Không được tiết lộ - Dự án vô hình vì thiếu quyền. doorkeeper: pre_authorization: status: "Xác thực" @@ -5017,9 +5091,9 @@ vi: #Common error messages invalid_request: unknown: "Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ hoặc không đúng định dạng." - missing_param: "Thiếu tham số cần thiết: %{value}." - request_not_authorized: "Yêu cầu cần được xác thực. Tham số yêu cầu xác thực bị thiếu hoặc không hợp lệ." - invalid_redirect_uri: "Uri chuyển hướng được yêu cầu không đúng định dạng hoặc không khớp với URI chuyển hướng máy khách." + missing_param: "Thiếu tham số bắt buộc: %{value}." + request_not_authorized: "Yêu cầu cần phải được ủy quyền. Tham số bắt buộc để ủy quyền yêu cầu bị thiếu hoặc không hợp lệ." + invalid_redirect_uri: "Uri chuyển hướng được yêu cầu không đúng định dạng hoặc không khớp với URI chuyển hướng ứng dụng khách." unauthorized_client: "Máy khách không được phép thực hiện yêu cầu bằng phương pháp này." access_denied: "Chủ sở hữu tài nguyên hoặc máy chủ ủy quyền đã từ chối yêu cầu." invalid_scope: "Phạm vi yêu cầu không hợp lệ, không xác định hoặc không đúng định dạng." @@ -5027,12 +5101,12 @@ vi: server_error: "Máy chủ ủy quyền đã gặp phải một điều kiện không mong muốn khiến nó không thể đáp ứng yêu cầu." temporarily_unavailable: "Máy chủ ủy quyền hiện không thể xử lý yêu cầu do quá tải tạm thời hoặc bảo trì máy chủ." #Configuration error messages - credential_flow_not_configured: "Dòng thông tin chứng thực của Chủ sở hữu Tài nguyên không được cấu hình do Doorkeeper.configure.resource_owner_from_credentials chưa được cấu hình." - resource_owner_authenticator_not_configured: "Tìm chủ sở hữu tài nguyên không thành công do Doorkeeper.configure.resource_owner_authenticator chưa được cấu hình." + credential_flow_not_configured: "Luồng thông tin xác thực về mật khẩu của chủ sở hữu tài nguyên không thành công do Doorkeeper.configure.resource_owner_from_credentials chưa được định cấu hình." + resource_owner_authenticator_not_configured: "Tìm chủ sở hữu tài nguyên không thành công do Doorkeeper.configure.resource_owner_authenticator chưa được định cấu hình." admin_authenticator_not_configured: "Quyền truy cập vào bảng quản trị bị cấm do Doorkeeper.configure.admin_authenticator không được định cấu hình." #Access grant errors unsupported_response_type: "Máy chủ ủy quyền không hỗ trợ loại phản hồi này." - unsupported_response_mode: "Máy chủ xác thực không hỗ trợ chế độ phản hồi này." + unsupported_response_mode: "Máy chủ ủy quyền không hỗ trợ chế độ phản hồi này." #Access token errors invalid_client: "Xác thực ứng dụng khách không thành công do máy khách không xác định, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ." invalid_grant: "Quyền được cung cấp không hợp lệ, hết hạn, bị thu hồi, không khớp với URI chuyển hướng được sử dụng trong yêu cầu ủy quyền hoặc được cấp cho một khách hàng khác." @@ -5044,7 +5118,7 @@ vi: revoke: unauthorized: "Bạn không được phép thu hồi mã thông báo này." forbidden_token: - missing_scope: 'Truy cập vào tài nguyên này yêu cầu phạm vi "%{oauth_scopes}".' + missing_scope: 'Việc truy cập vào tài nguyên này yêu cầu phạm vi "%{oauth_scopes}".' unsupported_browser: title: "Trình duyệt của bạn đã lỗi thời hoặc không được hỗ trợ." message: "Bạn có thể gặp phải lỗi và trải nghiệm không mong muốn trên trang này." @@ -5052,119 +5126,124 @@ vi: close_warning: "Bỏ qua cảnh báo này." oauth: application: - builtin: Built-in instance application - confidential: Bí mật + builtin: Ứng dụng phiên bản tích hợp + confidential: bí mật singular: "Ứng dụng OAuth" - scopes: "Phạm vi" - client_credentials: "Client credentials" + scopes: "phạm vi" + client_credentials: "Thông tin xác thực của khách hàng" plural: "Các ứng dụng OAuth" named: "Ứng dụng OAuth '%{name}'" new: "Ứng dụng OAuth mới" - non_confidential: Non confidential + non_confidential: Không bí mật default_scopes: "(Phạm vi mặc định)" instructions: - enabled: "Enable this application, allowing users to perform authorization grants with it." + enabled: "Kích hoạt ứng dụng này, cho phép người dùng thực hiện cấp phép với nó." name: "Tên ứng dụng của bạn. Điều này sẽ được hiển thị cho người dùng khác khi ủy quyền." redirect_uri_html: > Các URL người dùng được ủy quyền có thể được chuyển hướng đến. Mỗi mục nhập trên một dòng.
    Nếu bạn đang đăng ký một ứng dụng máy tính để bàn, hãy sử dụng URL sau. confidential: "Kiểm tra xem ứng dụng sẽ được sử dụng trong khi thông tin mật của khách hàng vẫn được đảm bảo. Các ứng dụng di động và Ứng dụng web được cho là không bảo mật." - scopes: "Chọn các phạm vi mà bạn muốn ứng dụng cấp quyền truy cập. Nếu không chọn phạm vi nào, mặc định là api_v3." + scopes: "Kiểm tra phạm vi bạn muốn ứng dụng cấp quyền truy cập. Nếu không có phạm vi nào được chọn, api_v3 sẽ được giả sử." client_credential_user_id: "ID người dùng tùy chọn để mạo danh khi khách hàng sử dụng ứng dụng này. Để trống để chỉ cho phép truy cập công cộng" - register_intro: "Nếu bạn đang phát triển ứng dụng khách API OAuth cho OpenProject, bạn có thể đăng ký nó bằng cách sử dụng biểu mẫu này để tất cả người dùng sử dụng." + register_intro: "Nếu bạn đang phát triển ứng dụng khách API OAuth cho OpenProject, bạn có thể đăng ký ứng dụng đó bằng biểu mẫu này để tất cả người dùng sử dụng." default_scopes: "" header: - builtin_applications: Built-in OAuth applications - other_applications: Other OAuth applications - empty_application_lists: No OAuth applications have been registered. + builtin_applications: Các ứng dụng OAuth tích hợp + other_applications: Các ứng dụng OAuth khác + empty_application_lists: Không có ứng dụng OAuth nào được đăng ký. client_id: "ID người dùng" client_secret_notice: > - Đây là lần duy nhất chúng tôi có thể in bí mật của khách hàng, vui lòng ghi lại và giữ an toàn. Nó nên được đối xử như mật khẩu và không thể được OpenProject lấy lại sau này. + Đây là lần duy nhất chúng tôi có thể in bí mật của khách hàng, vui lòng ghi lại và giữ an toàn. Nó phải được coi như một mật khẩu và OpenProject không thể lấy lại được sau này. authorization_dialog: authorize: "Xác thực" cancel: "Hủy bỏ và từ chối xác thực." - prompt_html: "Xác thực %{application_name} để sử dụng tài khoản của bạn %{login}?" - title: "Xác thực %{application_name}" + prompt_html: "Ủy quyền cho %{application_name} sử dụng tài khoản của bạn %{login}?" + title: "Ủy quyền %{application_name}" wants_to_access_html: > - Ứng dụng này yêu cầu quyền truy cập vào tài khoản OpenProject của bạn.
    Ứng dụng đã yêu cầu các quyền sau: + Ứng dụng này yêu cầu quyền truy cập vào tài khoản OpenProject của bạn.
    Nó đã yêu cầu các quyền sau: scopes: api_v3: "Truy cập đầy đủ API v3" - api_v3_text: "Ứng dụng sẽ nhận quyền đọc & viết đầy đủ vào API v3 của OpenProject để thực hiện các hành động thay mặt bạn." + api_v3_text: "Ứng dụng sẽ nhận được quyền truy cập đọc và ghi đầy đủ vào OpenProject API v3 để thay mặt bạn thực hiện các hành động." grants: created_date: "Đã duyệt" - scopes: "Phân Quyền" + scopes: "quyền" successful_application_revocation: "Thu hồi ứng dụng %{application_name} thành công." - none_given: "Chưa có ứng dụng OAuth nào được cấp quyền truy cập vào tài khoản người dùng của bạn." + none_given: "Không có ứng dụng OAuth nào được cấp quyền truy cập vào tài khoản người dùng của bạn." x_active_tokens: - other: "%{count} mã thông báo đang hoạt động" + other: "%{count} mã thông báo hoạt động" flows: - authorization_code: "Dòng mã xác thực" - client_credentials: "Dòng thông tin chứng thực khách hàng" - client_credentials: "Người dùng được sử dụng cho thông tin chứng thực khách hàng" - client_credentials_impersonation_set_to: "Người dùng thông tin chứng thực khách hàng được đặt thành" - client_credentials_impersonation_warning: "Lưu ý: Các khách hàng sử dụng dòng 'Thông tin chứng thực khách hàng' trong ứng dụng này sẽ có quyền của người dùng này." + authorization_code: "Luồng mã ủy quyền" + client_credentials: "Luồng thông tin xác thực của khách hàng" + client_credentials: "Người dùng được sử dụng cho thông tin xác thực của Khách hàng" + client_credentials_impersonation_set_to: "Người dùng thông tin đăng nhập của khách hàng được đặt thành" + client_credentials_impersonation_warning: "Lưu ý: Khách hàng sử dụng luồng 'Thông tin xác thực khách hàng' trong ứng dụng này sẽ có các quyền của người dùng này" client_credentials_impersonation_html: > - Theo mặc định, OpenProject cung cấp xác thực OAuth 2.0 qua %{authorization_code_flow_link}. Bạn có thể chọn kích hoạt %{client_credentials_flow_link}, nhưng bạn phải cung cấp một người dùng mà yêu cầu sẽ được thực hiện thay mặt cho họ. - authorization_error: "Đã xảy ra lỗi xác thực." - revoke_my_application_confirmation: "Bạn thực sự muốn xóa ứng dụng này không? Điều này sẽ thu hồi %{token_count} mã thông báo còn hoạt động cho nó." - my_registered_applications: "Các ứng dụng OAuth đã đăng ký" + Theo mặc định, OpenProject cung cấp ủy quyền OAuth 2.0 thông qua %{authorization_code_flow_link}. Bạn có thể tùy ý bật %{client_credentials_flow_link}, nhưng bạn phải cung cấp người dùng mà yêu cầu của họ sẽ được thực hiện thay mặt họ. + authorization_error: "Đã xảy ra lỗi ủy quyền." + revoke_my_application_confirmation: "Bạn có thực sự muốn xóa ứng dụng này? Điều này sẽ thu hồi %{token_count} hoạt động cho nó." + my_registered_applications: "Ứng dụng OAuth đã đăng ký" oauth_client: urn_connection_status: - connected: "Đã kết nối" - error: "Lỗi" - failed_authorization: "Xác thực không thành công" - not_connected: "Not connected" + connected: "đã kết nối" + error: "lỗi" + failed_authorization: "Ủy quyền không thành công" + not_connected: "Không được kết nối" labels: label_oauth_integration: "Tích hợp OAuth2" label_redirect_uri: "URI chuyển hướng" label_request_token: "Yêu cầu mã thông báo" label_refresh_token: "Làm mới mã thông báo" errors: - oauth_authorization_code_grant_had_errors: "Cấp quyền xác thực OAuth2 không thành công" - oauth_reported: "Nhà cung cấp OAuth2 đã báo cáo" - oauth_returned_error: "OAuth2 đã trả về lỗi" - oauth_returned_json_error: "OAuth2 đã trả về lỗi JSON" - oauth_returned_http_error: "OAuth2 đã trả về lỗi mạng" - oauth_returned_standard_error: "OAuth2 đã trả về lỗi nội bộ" - wrong_token_type_returned: "OAuth2 đã trả về loại mã thông báo sai, mong đợi AccessToken::Bearer" - oauth_issue_contact_admin: "OAuth2 đã báo cáo lỗi. Vui lòng liên hệ với quản trị viên hệ thống của bạn." - oauth_client_not_found: "Khách hàng OAuth2 không tìm thấy ở điểm cuối 'callback' (redirect_uri)." + oauth_authorization_code_grant_had_errors: "Cấp quyền OAuth2 không thành công" + oauth_reported: "Đã báo cáo nhà cung cấp OAuth2" + oauth_returned_error: "OAuth2 trả về lỗi" + oauth_returned_json_error: "OAuth2 trả về lỗi JSON" + oauth_returned_http_error: "OAuth2 trả về lỗi mạng" + oauth_returned_standard_error: "OAuth2 trả về lỗi nội bộ" + wrong_token_type_returned: "OAuth2 trả về sai loại mã thông báo, mong đợi AccessToken::Bearer" + oauth_issue_contact_admin: "OAuth2 đã báo lỗi. Vui lòng liên hệ với quản trị viên hệ thống của bạn." + oauth_client_not_found: "Không tìm thấy ứng dụng khách OAuth2 trong điểm cuối 'gọi lại' (redirect_uri)." refresh_token_called_without_existing_token: > - Lỗi nội bộ: Đã gọi refresh_token mà không có mã thông báo tồn tại trước đó. - refresh_token_updated_failed: "Lỗi trong việc cập nhật OAuthClientToken" + Lỗi nội bộ: Được gọi là Refresh_token mà không có mã thông báo hiện có trước đó. + refresh_token_updated_failed: "Lỗi trong quá trình cập nhật OAuthClientToken" oauth_client_not_found_explanation: > - Lỗi này xuất hiện sau khi bạn đã cập nhật client_id và client_secret trong OpenProject, nhưng chưa cập nhật trường 'Return URI' trong nhà cung cấp OAuth2. - oauth_code_not_present: "OAuth2 'code' không tìm thấy ở điểm cuối 'callback' (redirect_uri)." + Lỗi này xuất hiện sau khi bạn đã cập nhật client_id và client_secret trong OpenProject nhưng chưa cập nhật trường 'Return URI' trong nhà cung cấp OAuth2. + oauth_code_not_present: "Không tìm thấy 'mã' OAuth2 trong điểm cuối 'gọi lại' (redirect_uri)." oauth_code_not_present_explanation: > - Lỗi này xuất hiện nếu bạn đã chọn loại response_type sai trong nhà cung cấp OAuth2. Response_type nên là 'code' hoặc tương tự. - oauth_state_not_present: "OAuth2 'state' không tìm thấy ở điểm cuối 'callback' (redirect_uri)." + Lỗi này xuất hiện nếu bạn chọn sai loại phản hồi trong nhà cung cấp OAuth2. Response_type phải là 'code' hoặc tương tự. + oauth_state_not_present: "Không tìm thấy 'trạng thái' OAuth2 trong điểm cuối 'gọi lại' (redirect_uri)." oauth_state_not_present_explanation: > - 'State' được sử dụng để chỉ OpenProject nơi tiếp tục sau khi xác thực OAuth2 thành công. Thiếu 'state' là lỗi nội bộ có thể xuất hiện trong quá trình thiết lập. Vui lòng liên hệ với quản trị viên hệ thống của bạn. + 'Trạng thái' được sử dụng để chỉ ra cho OpenProject nơi tiếp tục sau khi ủy quyền OAuth2 thành công. 'Trạng thái' bị thiếu là lỗi nội bộ có thể xuất hiện trong quá trình thiết lập. Vui lòng liên hệ với quản trị viên hệ thống của bạn. rack_oauth2: - client_secret_invalid: "Bí mật khách hàng không hợp lệ (client_secret_invalid)" + client_secret_invalid: "Bí mật của ứng dụng khách không hợp lệ (client_secret_invalid)" invalid_request: > - Máy chủ Xác thực OAuth2 đã phản hồi với 'invalid_request'. Lỗi này xuất hiện nếu bạn cố gắng xác thực nhiều lần hoặc trong trường hợp có sự cố kỹ thuật. - invalid_response: "Máy chủ Xác thực OAuth2 đã cung cấp phản hồi không hợp lệ (invalid_response)" - invalid_grant: "Máy chủ Xác thực OAuth2 yêu cầu bạn xác thực lại (invalid_grant)." - invalid_client: "Máy chủ Xác thực OAuth2 không nhận ra OpenProject (invalid_client)." - unauthorized_client: "Máy chủ Xác thực OAuth2 từ chối loại cấp quyền (unauthorized_client)" - unsupported_grant_type: "Máy chủ Xác thực OAuth2 yêu cầu bạn xác thực lại (unsupported_grant_type)." - invalid_scope: "Bạn không được phép truy cập tài nguyên yêu cầu (invalid_scope)." + Máy chủ ủy quyền OAuth2 phản hồi bằng 'invalid_request'. Lỗi này xuất hiện nếu bạn cố gắng ủy quyền nhiều lần hoặc trong trường hợp có vấn đề về kỹ thuật. + invalid_response: "Máy chủ ủy quyền OAuth2 đã cung cấp phản hồi không hợp lệ (invalid_response)" + invalid_grant: "Máy chủ ủy quyền OAuth2 yêu cầu bạn ủy quyền lại (invalid_grant)." + invalid_client: "Máy chủ ủy quyền OAuth2 không nhận ra OpenProject (invalid_client)." + unauthorized_client: "Máy chủ ủy quyền OAuth2 từ chối loại cấp phép (unauthorized_client)" + unsupported_grant_type: "Máy chủ ủy quyền OAuth2 yêu cầu bạn ủy quyền lại (unsupported_grant_type)." + invalid_scope: "Bạn không được phép truy cập tài nguyên được yêu cầu (invalid_scope)." http: request: - failed_authorization: "Yêu cầu phía máy chủ không được xác thực thành công." - missing_authorization: "Yêu cầu phía máy chủ không thành công do thiếu thông tin xác thực." + failed_authorization: "Yêu cầu phía máy chủ không tự ủy quyền được." + missing_authorization: "Yêu cầu phía máy chủ không thành công do thiếu thông tin ủy quyền." response: - unexpected: "Nhận được phản hồi không mong đợi." + unexpected: "Đã nhận được phản hồi bất ngờ." you: bạn link: liên kết plugin_openproject_auth_plugins: - name: "Các plugin xác thực OpenProject" + name: "Plugin xác thực OpenProject" description: "Tích hợp các nhà cung cấp chiến lược OmniAuth để xác thực trong OpenProject." plugin_openproject_auth_saml: name: "OmniAuth SAML / Đăng nhập một lần" - description: "Thêm nhà cung cấp OmniAuth SAML vào OpenProject" + description: "Thêm nhà cung cấp SAML OmniAuth vào OpenProject" enterprise_plans: - legacy_enterprise: "Enterprise Plan" + legacy_enterprise: "Kế hoạch doanh nghiệp" token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "Rời khỏi OpenProject" + warning_message: "Bạn sắp rời khỏi OpenProject và truy cập vào một trang web bên ngoài. Xin lưu ý rằng các trang web bên ngoài không nằm dưới sự kiểm soát của chúng tôi và có thể có các chính sách bảo mật và an ninh khác nhau." + continue_message: "Bạn có chắc chắn muốn tiếp tục đến liên kết bên ngoài sau đây không?" + continue_button: "Tiếp tục đến trang web bên ngoài" diff --git a/config/locales/crowdin/zh-CN.seeders.yml b/config/locales/crowdin/zh-CN.seeders.yml index 3e5b9f8d136..1ee133e5684 100644 --- a/config/locales/crowdin/zh-CN.seeders.yml +++ b/config/locales/crowdin/zh-CN.seeders.yml @@ -47,7 +47,7 @@ zh-CN: item_0: name: 项目查询查看器 item_1: - name: 项目查询查看器 + name: 项目查询编辑器 work_package_roles: item_0: name: 工作包编辑者 diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 225c8cc1392..1b70fd456a6 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -109,6 +109,23 @@ zh-CN: explanation: text: "如果用户的多项操作(例如,更新工作包两次)的时间间隔小于指定的时间跨度,则这些操作将被聚合为单个操作,并在应用程序中显示为单个操作。这也会将通知延迟同等的时间,从而减少电子邮件的发送数量,并且还会影响 %{webhook_link} 延迟。" link: "Webhook" + mcp_configurations: + index: + description: "Model Context Protocol 允许 AI 智能体向其用户提供此 OpenProject 实例所公开的工具和资源。" + resources_heading: "资源" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "更新资源" + tools_heading: "工具" + tools_description: "OpenProject 实现了以下工具。每种工具都可以根据需要启用、重命名和描述。有关详情,请参阅[关于 MCP 工具的文档](docs_url)。" + tools_submit: "更新工具" + multi_update: + success: "MCP 配置已成功更新。" + server_form: + description_caption: "如何向连接到 MCP 服务器的其他应用程序描述该 MCP 服务器。" + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP 配置无法更新。" + success: "MCP 配置已成功更新。" scim_clients: authentication_methods: sso: "来自身份提供商的 JWT" @@ -587,6 +604,7 @@ zh-CN: is_for_all_blank_slate: heading: 适用于所有项目 description: 由于选中了“适用于所有项目”选项,所有项目都启用了此项目特性。无法为个别项目停用该特性。 + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: 目前有可用的类型。 form: @@ -601,6 +619,9 @@ zh-CN: work_package_priorities: new_label: "新优先级" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "生成的工件将作为 PDF 附件保存到工件工作包中。" description_file_link_export: "工件工作包将有一个文件链接,指向存储在外部文件存储空间的 PDF 文件。此项目需要一个有效文件存储空间,其中包含自动管理的项目文件夹。目前仅支持 Nextcloud 文件存储空间。" @@ -614,6 +635,7 @@ zh-CN: label_request_submission: "请求提交" project_attributes_description: > 选择哪些项目特性应包含在项目启动请求中。此列表仅包含为此项目启用的[项目特性](project_attributes_url)。 + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: 编辑状态 wizard: @@ -703,9 +725,11 @@ zh-CN: create_button: "创建" name_label: "令牌名称" created_dialog: + one_time_warning: "这将是您看到此令牌的唯一机会。请务必立即复制。" token/api: title: "API 令牌已生成" - warning: "这将是您看到此令牌的唯一机会。请务必立即复制。" + token/rss: + title: "RSS 令牌已生成" failed_to_reset_token: "无法重置访问令牌: %{error}" failed_to_create_token: "创建访问令牌失败: %{error}" failed_to_revoke_token: "撤销访问令牌失败: %{error}" @@ -715,6 +739,9 @@ zh-CN: notice_api_token_revoked: "API 令牌已被删除。要创建新令牌,请使用 API 部分中的链接。" notice_rss_token_revoked: "RSS 令牌已被删除。要创建新令牌,请使用 RSS 部分中的链接。" notice_ical_token_revoked: '项目“%{project_name}”的日历“%{calendar_name}”的 iCalendar 令牌“%{token_name}”已被撤销。 此令牌的 iCalendar URL 现在无效。' + password_confirmation_dialog: + confirmation_required: "需要输入帐户密码以确认此更改。" + title: "确认密码以继续" news: index: no_results_title_text: 目前没有消息报告。 @@ -1218,6 +1245,10 @@ zh-CN: onthefly: "自动创建用户" port: "端口" tls_certificate_string: "LDAP 服务器 SSL 证书" + mcp_configuration: + enabled: 已启用 + title: 标题 + description: 描述 member: roles: "角色" notification: @@ -1476,6 +1507,7 @@ zh-CN: even: "必须是偶数。" exclusion: "是保留关键字。" feature_disabled: 不可用。 + feature_disabled_for_project: 已对此项目禁用。 file_too_large: "太大 (最大大小为 %{count} 字节)。" filter_does_not_exist: "筛选器不存在。" format: "与预期的格式“%{expected}”不匹配。" @@ -1498,7 +1530,8 @@ zh-CN: not_a_datetime: "不是有效的日期时间。" not_a_number: "不是一个数字。" not_allowed: "没有权限使用。" - not_json: "不是一个有效的 JSON 对象。" + not_json: "无法解析为 JSON。" + not_json_object: "不是 JSON 对象。" not_an_integer: "不是一个整数。" not_an_iso_date: "不是有效日期。所需格式:YYYY-MM-DD。" not_same_project: "不属于同一个项目。" @@ -1893,7 +1926,10 @@ zh-CN: status: "工作包状态" token/api: other: 访问令牌 - type: "类型" + token/rss: + other: "RSS 令牌" + type: + other: "类型" user: "用户" version: "版本" workflow: "工作流" @@ -2106,6 +2142,7 @@ zh-CN: button_click_to_reveal: "单击以显示" button_close: "关闭" button_collapse_all: "全部折叠" + button_confirm: "确认" button_configure: "配置" button_continue: "继续" button_complete: "完成" @@ -2138,6 +2175,7 @@ zh-CN: button_print: "打印" button_quote: "引用" button_remove: 移除 + button_remove_permanently: "永久移除" button_remove_reminder: "删除提醒" button_rename: "重命名" button_replace: "替换" @@ -2369,7 +2407,7 @@ zh-CN: baseline_comparison: 基线比较 board_view: 高级面板 calculated_values: 计算值 - conditional_highlighting: 条件高亮 + capture_external_links: 捕获外部链接 internal_comments: 内部评论 custom_actions: 自定义操作 custom_field_hierarchies: 层级 @@ -2379,10 +2417,12 @@ zh-CN: edit_attribute_groups: 编辑属性组 gantt_pdf_export: 甘特图 PDF 导出 ldap_groups: LDAP 用户和群组同步 + mcp_server: MCP 服务器 nextcloud_sso: Nextcloud存储的单点登录(SSO) one_drive_sharepoint_file_storage: OneDrive/SharePoint 文件存储 placeholder_users: 占位符用户 portfolio_management: 项目组合管理 + project_creation_wizard: 项目启动请求 project_list_sharing: 项目列表共享 readonly_work_packages: 只读工作包 scim_api: SCIM 服务器 API @@ -2402,7 +2442,7 @@ zh-CN: plan_text_html: "从 %{plan_name} 开始可用。" unlimited: "无限制" already_have_token: > - 已经有令牌?使用下方按钮添加以升级到预订的 Enterprise 方案。 + 已经有令牌?使用下方按钮添加以升级到预订的企业版方案。 hide_banner: "隐藏此广告" homescreen_description: > 企业计划通过额外的[企业附加组件](enterprise_url) 和专业支持扩展了OpenProject社区版,是在关键任务环境中运行OpenProject的组织的理想选择。 @@ -2423,8 +2463,8 @@ zh-CN: description: "使用引用的属性和文本自动生成主题。" customize_life_cycle: description: "创建和组织与PM2项目周期规划不同的项目阶段。" - conditional_highlighting: - description: "想让工作包脱颖而出吗?在工作包表中使用条件高亮显示。" + capture_external_links: + description: "在用户访问外部链接前捕获链接并发出警告,以防范社会工程攻击。" work_package_query_relation_columns: description: "需要在工作包列表中看到关系或子项吗?" edit_attribute_groups: @@ -2454,6 +2494,8 @@ zh-CN: custom_actions: title: "自定义操作" description: "自定义操作是一键快捷方式,指向一组预定义的操作,您可以根据状态、角色、类型或项目在某些工作包上使用这些操作。" + mcp_server: + description: "通过 MCP 将 AI 智能体与 OpenProject 实例集成。" nextcloud_sso: title: "Nextcloud存储的单点登录(SSO)" description: "使用单点登录为您的 Nextcloud 存储启用无缝且安全的身份验证。简化访问管理并提升用户便利性。" @@ -2465,6 +2507,8 @@ zh-CN: description: "允许用户使用 SAML 或 OpenID Connect 通过外部 SSO 提供商登录,以实现无缝访问,并与现有身份系统集成。" virus_scanning: description: "确保在 OpenProject 中上传的文件在被其他用户访问之前进行病毒扫描。" + project_creation_wizard: + description: "生成分步向导,帮助项目经理填写项目启动请求。" placeholder_users: title: 占位符用户 description: > @@ -2535,7 +2579,7 @@ zh-CN: error_color_could_not_be_saved: "无法保存颜色" error_cookie_missing: "OpenProject cookie 丢失。请确保已启用 cookie,因为如果不启用,此应用程序将无法正常运行。" error_custom_option_not_found: "选项不存在。" - error_enterprise_plan_needed: "您需要 %{plan} Enterprise 方案才能执行此操作。" + error_enterprise_plan_needed: "您需要 %{plan}企业版方案才能执行此操作。" error_enterprise_activation_user_limit: "无法激活您的帐户 (已达到用户限制)。请与管理员联系以获取访问权限。" error_enterprise_token_invalid_domain: "企业版未激活。您的企业版令牌的域名(%{actual})与系统的主机名(%{expected})不匹配。" error_failed_to_delete_entry: "无法删除此条目。" @@ -2761,19 +2805,17 @@ zh-CN: learn_about: "详细了解所有新功能" missing: "目前还没有高亮显示的功能。" #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > - 此版本包含各种新功能和改进,例如: + 此版本包含多项新功能和改进,例如: new_features_list: - line_0: 实时文档协作。 - line_1: 能够将相关项目构建成项目群与项目组合,使其专注于战略目标(企业版附加组件)。 - line_2: 更好的会议管理,包括草稿模式、演示模式、增强的结果和 iCal 订阅。 - line_3: 更新了 SharePoint 集成,具有更严格的权限(企业版附加组件)。 - line_4: 重新设计了项目概览,具有新的选项卡、可配置的微件以及改进的布局。 - line_5: 可以选择更严格地保护不在同一项目中工作的用户的隐私。 - line_6: 改进了项目创建流程,可以更好地选择模板。 - line_7: 更智能的全局搜索,包括类型和状态,提高了多个自动补全工具的精确度。 - line_8: 通过替代文本和改进的图表颜色,提高了可访问性。 + line_0: 自动化项目启动(企业版附加组件)。 + line_1: "会议:添加新工作包或现有工作包作为成果。" + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "定期会议:将议程条目复制到下一事件。" + line_4: "发布到社区:特性高亮显示。" + line_5: 在打开用户提供内容中的外部链接前发出警告(企业版附加组件)。 + line_6: 提升了性能和用户体验,包括“活动”选项卡和“文档”模块。 links: upgrade_enterprise_edition: "升级到企业版" postgres_migration: "将您的安装迁移到 PostgreSQL" @@ -2841,14 +2883,17 @@ zh-CN: instructions_after_error: "你可以尝试点击 %{signin} 重新登录。如果错误仍然存在,请向您的管理员寻求帮助。" menus: admin: - mail_notification: "电子邮件通知" - mails_and_notifications: "电子邮件和通知" + ai: "人工智能 (AI)" aggregation: "聚合" api_and_webhooks: "API 和 Webhook" + mail_notification: "电子邮件通知" + mails_and_notifications: "电子邮件和通知" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "添加…" my_account: access_tokens: + description: "提供商令牌由 OpenProject 签发,允许其他应用程序访问。客户端令牌由其他应用程序签发,允许 OpenProject 对其进行访问。" no_results: title: "没有要显示的访问令牌" description: "他们都已被禁用。他们可以在管理菜单重新启用。" @@ -2858,34 +2903,56 @@ zh-CN: expiration: "过期" indefinite_expiration: "永不" simple_revoke_confirmation: "确定要撤销此令牌吗?" + tabs: + client: + title: "客户端令牌" + provider: + title: "提供商令牌" token/api: + blank_description: "目前还没有 API 令牌。您可以使用下方按钮创建一个。" + blank_title: "没有 API 令牌" title: "API" + table_title: "API 令牌" text_hint: "API 令牌允许第三方应用程序通过 REST API 与此 OpenProject 实例通信。" + static_token_name: "API 令牌" disabled_text: "管理员未启用 API 令牌。请联系管理员以使用此功能。" add_button: "API 令牌" - api: - static_token_name: "API 令牌" ical: + blank_description: "要添加 iCalendar 令牌,请从项目的“日历”模块中订阅新日历或现有日历。您必须拥有必要的权限。" + blank_title: "没有 iCalendar 令牌" title: "iCalendar" + table_title: "iCalendar 令牌" text_hint_link: "iCalendar 令牌允许用户[订阅OpenProject日历](docs_url),并查看来自外部客户端的最新工作包信息。" disabled_text: "管理员未启用 iCalendar 订阅。请联系管理员以使用此功能。" - empty_text_hint: "要添加 iCalendar 令牌,请从项目的日历模块中订阅新的或现有日历。您必须拥有必要的权限。" - oauth: + oauth_application: + active_tokens: "有效令牌" + blank_description: "没有为您配置和激活第三方应用程序访问权限。" + blank_title: "没有 OAuth 应用程序令牌" + last_used_at: "最近使用时间" title: "OAuth" - text_hint: "OAuth 令牌允许第三方应用程序与此 OpenProject 实例连接。" - empty_text_hint: "没有为您配置和激活第三方应用程序访问权限。请联系管理员以激活此功能。" - rss: + table_title: "OAuth 应用程序令牌" + text_hint: "OAuth 应用程序令牌允许第三方应用程序与此 OpenProject 实例关联。" + oauth_client: + blank_description: "目前还没有 OAuth 客户端令牌。" + blank_title: "没有 OAuth 客户端令牌" + failed: "出错了,无法移除令牌。请稍后再试。" + integration_type: "集成类型" + table_title: "OAuth 客户端令牌" + text_hint: "OAuth 客户端令牌允许此 OpenProject 实例与文件存储等外部应用程序关联。" + title: "OAuth" + remove_token: "是否确实要移除此令牌?您需要再次登录 %{integration}。" + removed: "OAuth 客户端令牌已成功移除" + unknown_integration: "未知" + token/rss: + add_button: "RSS 令牌" + blank_description: "目前还没有 RSS 令牌。您可以使用下方按钮创建一个。" + blank_title: "没有 RSS 令牌" title: "RSS" + table_title: "RSS 令牌" text_hint: "RSS 令牌允许用户通过外部 RSS 阅读器了解此 OpenProject 实例中的最新变化。" static_token_name: "RSS 令牌" disabled_text: "管理员未启用 RSS 令牌。请联系管理员以使用此功能。" storages: - title: "文件存储" - text_hint: "文件存储区令牌将此 OpenProject 实例与外部文件存储区连接。" - empty_text_hint: "没有与您的帐户相关联的存储区访问权限。" - revoke_token: "是否确实要移除此令牌?您需要再次登录 %{storage}" - removed: "文件存储区令牌已成功移除" - failed: "出错了,无法移除令牌。请稍后再试。" unknown_storage: "未知存储" notifications: reasons: @@ -2947,6 +3014,7 @@ zh-CN: label_always_visible: "总是显示" label_announcement: "公告" label_angular: "AngularJS" + label_app_modules: "%{app_title} modules" label_api_access_key: "API 访问键" label_api_access_key_created_on: "API 访问密钥创建于 %{value} 前" label_api_access_key_type: "API" @@ -3202,6 +3270,7 @@ zh-CN: label_journal_diff: "描述的对比" label_language: "语言" label_languages: "语言" + label_external_links: "外部链接" label_locale: "语言和地区" label_jump_to_a_project: "跳转到一个项目..." label_keyword_plural: "关键词" @@ -3379,9 +3448,6 @@ zh-CN: label_project_hierarchy: "项目层次结构" label_project_mappings: "项目" label_project_new: "新的项目" - label_project_initiation_request: "新项目启动请求" - label_project_creation_wizard: "新项目创建向导" - label_project_mandate: "新项目授权" label_project_plural: "项目" label_project_list_plural: "项目列表" label_project_life_cycle: "项目生命周期" @@ -3842,7 +3908,7 @@ zh-CN: notice_not_authorized: "您无权访问此页。" notice_not_authorized_archived_project: "您尝试访问的项目已存档。" notice_requires_enterprise_token: "企业令牌缺失或不允许访问此页面。" - notice_password_confirmation_failed: "您的密码不正确。无法继续。" + notice_password_confirmation_failed: "输入的密码不正确。" notice_principals_found_multiple: "找到 %{number} 条结果。\n 点击以关注第一条结果。" notice_principals_found_single: "这有一个结果。\n点击来关注它。" notice_parent_item_not_found: "未找到父项" @@ -4191,6 +4257,9 @@ zh-CN: setting_allowed_link_protocols: "允许的链接协议" setting_allowed_link_protocols_text_html: >- 允许这些协议在工作包描述、长文本字段和评论中显示为链接。例如,%{tel_code} 或 %{element_code}。每行输入一个协议。
    协议 %{http_code}、%{https_code} 和 %{mailto_code} 始终允许。 + setting_capture_external_links: "捕获外部链接" + setting_capture_external_links_text: > + 启用后,格式化文本中的所有外部链接在离开应用程序前都会重定向至警告页面。这有助于保护用户免受潜在恶意外部网站的危害。 setting_after_first_login_redirect_url: "首次登录重定向" setting_after_first_login_redirect_url_text_html: > 设置用户首次登录后的重定向路径。如果该路径为空,则重定向到主页以进行导览介绍。
    示例: /my/page @@ -4203,11 +4272,17 @@ zh-CN: setting_apiv3_cors_origins_text_html: > 如果启用了 CORS ,这些是允许访问 OpenProject API 的源。
    请查看有关“源”标题的文档,了解如何指定预期值。 setting_apiv3_write_readonly_attributes: "对只读属性的写访问权限" - setting_apiv3_write_readonly_attributes_instructions_html: > - 如果启用,API 将允许管理员在创建时写入静态只读属性,如 createdAt 和 author。
    警告:此设置的用例包括导入数据,但允许管理员冒充其他用户创建项目。不过,所有创建请求都将以真实作者的身份记录。
    有关属性和支持资源的更多信息,请参阅 %{api_documentation_link}。 + setting_apiv3_write_readonly_attributes_instructions: > + 启用后,API 将允许管理员在创建过程中写入静态只读属性,如 createdAt 和 author。 + setting_apiv3_write_readonly_attributes_warning: > + 此设置可用于数据导入等用例,但允许管理员以其他用户身份模拟项目创建。不过,所有创建请求都会记录真实作者信息。 + setting_apiv3_write_readonly_attributes_additional: > + 有关特性和受支持资源的详细信息,请参阅%{api_documentation_link}。 setting_apiv3_max_page_size: "最大 API 页面大小" - setting_apiv3_max_page_instructions_html: > - 设置 API 将响应的最大页面大小。将无法执行在单个页面上返回更多值的 API 请求。
    警告:请仅在您确定为何需要更改的情况下更改此值。设置为较高的值将对性能造成显著影响,而值低于每页选项时将导致分页视图出错。 + setting_apiv3_max_page_size_instructions: > + 设置 API 将响应的最大页面大小。将无法执行在单个页面上返回更多值的 API 请求。 + setting_apiv3_max_page_size_warning: > + 请仅在确定有必要的情况下更改该值。如果设置的值过高,会严重影响性能,而如果设置的值低于每页选项,则会导致分页视图出错。 setting_apiv3_docs: "文档" setting_apiv3_docs_enabled: "启用文档页面" setting_apiv3_docs_enabled_instructions_html: > @@ -4392,7 +4467,7 @@ zh-CN: omniauth_direct_login_hint_html: > 如果激活该选项,登录请求将重定向到已配置的 omniauth 提供商。登录下拉菜单和登录页面将被禁用。
    注意:除非同时禁用密码登录,否则启用此选项后,用户仍可通过访问 %{internal_path}登录页面。 remapping_existing_users_hint: > - 如果启用,则任何已配置的身份提供商均可根据电子邮件地址允许现有用户登录,即使用户此前从未通过该提供商登录过也是如此。在将 OpenProject 实例迁移到新的 SSO 提供商时,此功能会有一定的帮助,但如果使用的提供商并未受到您的实例所有用户的信任,则不建议启用。 + 如果启用,则允许任何已配置的身份提供商基于用户名登录现有用户,即使用户此前从未通过该提供商登录过。在将 OpenProject 实例迁移到新的 SSO 提供商时,此功能会有一定的帮助,但如果使用的提供商并未受到您的实例所有用户的信任,则不建议启用。 attachments: whitelist_text_html: > 为上传的文件定义有效文件扩展名和/或 MIME 类型列表。
    输入文件扩展名(例如 %{ext_example})或 MIME 类型(例如 %{mime_example})。
    留空以允许上传任何文件类型。允许输入多个值(每个值一行)。 @@ -4498,7 +4573,7 @@ zh-CN: project_mandate: "项目授权" submission: description_template: > - **此工作包是在 %{wizard_name} 工作流完成后自动创建的**。 包含所有提交信息的 PDF 工件已生成并附加到此工作包,供参考和审核。 如果需要更新或重新运行初始化步骤,您可以随时使用下方链接重新打开向导: + **此工作包是在 %{wizard_name} 工作流完成后自动创建的**。 包含所有已提交信息的 PDF 工件已生成并附加到此工作包,以供参考和审核。 如果需要更新或重新运行启动步骤,您可以随时使用下方链接重新打开向导: description: "当用户提交项目启动请求时,将创建一个新的工作包,并以 PDF 文件形式附上请求工件。以下设置定义了新工作包的类型、状态和受理人。" work_package_type: "工作包类型" work_package_type_caption: "应当用于存储已完成工件的工作包类型。" @@ -4666,6 +4741,7 @@ zh-CN: 注:如果启用,这会在 %{information_panel_label} 管理面板中和首页上显示一个包含您的安装状态的徽章。徽章仅向管理员显示。
    徽章将根据官方的 OpenProject 版本数据库检查您当前的 OpenProject 版本,提醒您是否存在任何更新或已知漏洞。如需详细了解检查可以提供哪些信息,需要哪些数据来提供可用更新,以及如何禁用此检查,请访问配置文档。 text_own_membership_delete_confirmation: "您要移除部分或全部权限,并且可能无法在此后编辑这个项目。\n您确定要继续吗?" text_permanent_delete_confirmation_checkbox_label: "我理解这种删除不可逆转" + text_permanent_remove_confirmation_checkbox_label: "我明白此移除无法撤消" text_plugin_assets_writable: "插件资产目录可写" text_powered_by: "Powered by %{link}" text_project_identifier_info: "只有小写字母 (a-z)、 数字、 短划线和下划线被允许,必须以小写字母开头。" @@ -4755,8 +4831,8 @@ zh-CN: other: "暂时锁定(%{count} 次尝试登录失败)" confirm_status_change: "您即将更改 \"%{name}\" 的状态。确实要继续吗?" deleted: "已删除的用户" - error_status_change_self: "You cannot change your own user status." - error_admin_change_on_non_admin: "Only administrators can change the status of administrator users." + error_status_change_self: "您不能更改自己的用户状态。" + error_admin_change_on_non_admin: "只有管理员可以更改管理员用户的状态。" error_status_change_failed: "用户状态更改失败,因为以下错误: %{errors}" invite: 通过电子邮件邀请用户 invited: 已邀请 @@ -5159,3 +5235,8 @@ zh-CN: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "离开 OpenProject" + warning_message: "您即将离开 OpenProject 并访问外部网站。请注意,外部网站不受我们的管控,可能采用不同的隐私和安全政策。" + continue_message: "确定要继续访问以下外部链接吗?" + continue_button: "继续访问外部网站" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 3759b36bee1..01483c870b2 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -109,6 +109,23 @@ zh-TW: explanation: text: "使用者的個別操作(例如:在短時間內更新同一工作套件兩次)若時間差距小於指定時長,系統會將這些操作合併為單一動作,並於應用程式中以單一動作顯示。\n此機制同時會延遲通知發送相同的時間,以減少電子郵件數量,並且會影響 %{webhook_link} 的延遲時間。" link: "webhook" + mcp_configurations: + index: + description: "模型上下文協定允許 AI 代理向其使用者提供此 OpenProject 實體所揭露的工具與資源。" + resources_heading: "資源" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "更新資源" + tools_heading: "工具" + tools_description: "OpenProject 實作下列工具。每個工具都可以依您的需求啟用、重新命名和描述。如需詳細資訊,請參閱 [MCP 工具說明文件](docs_url)。" + tools_submit: "更新工具" + multi_update: + success: "MCP 組態已成功更新。" + server_form: + description_caption: "MCP 伺服器將如何描述給連線到它的其他應用程式。" + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "無法更新 MCP 設定。" + success: "MCP 組態已成功更新。" scim_clients: authentication_methods: sso: "來自身份提供者的 JWT" @@ -589,6 +606,7 @@ zh-TW: is_for_all_blank_slate: heading: 對所有的專案 description: 由於已勾選「適用於所有專案」選項,因此所有專案都啟用此專案屬性。個別專案無法停用。 + enabled_via_assignee_when_submitted_html: 此專案屬性無法停用,因為它已被設定為專案啟動請求提交時的 指派人。 types: no_results_title_text: 目前沒有可用的類型 form: @@ -603,6 +621,9 @@ zh-TW: work_package_priorities: new_label: "新優先權" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "產生的產物將會以 PDF 附件的形式,儲存到該產物的工作套件中。" description_file_link_export: "該成品工作套件將會包含一個檔案連結,指向儲存在外部檔案儲存空間中的 PDF 檔案。這要求有一個具備檔案儲存功能的空間,並且其中有為此專案自動化管理的專案資料夾。目前僅支援 Nextcloud 檔案儲存空間。" @@ -616,6 +637,7 @@ zh-TW: label_request_submission: "要求提交" project_attributes_description: > 選擇哪些專案屬性應包含在專案啟動請求中。此清單僅包含此專案啟用的 [專案屬性](project_attributes_url)。 + enabled_because_required_html: 由於此專案屬性被定義為必填項目,因此無法在此專案啟動請求中停用。此設定可由系統管理員於 管理設定 中進行變更。 status: button_edit: 編輯狀態 wizard: @@ -705,9 +727,11 @@ zh-TW: create_button: "建立" name_label: "令牌名稱" created_dialog: + one_time_warning: "這是您唯一一次看到此令牌(Token)的機會,請務必立即複製。" token/api: title: "API 令牌(Token)已生成。" - warning: "這是您唯一一次看到此令牌(Token)的機會,請務必立即複製。" + token/rss: + title: "已產生 RSS 令牌" failed_to_reset_token: "無法重置訪問令牌(Token): %{error}" failed_to_create_token: "無法建立訪問令牌(Token): %{error}" failed_to_revoke_token: "無法撤銷訪問令牌(Token): %{error}" @@ -717,6 +741,9 @@ zh-TW: notice_api_token_revoked: "API 令牌(Token)已被刪除。請使用 API 區段中的按鈕產生新的。" notice_rss_token_revoked: "RSS 令牌(Token)已被刪除。 請使用 在RSS 選項裡提供的連結建立新的。" notice_ical_token_revoked: '專案「%{project_name}」日曆「%{calendar_name}」的 iCalendar 令牌(Token)「%{token_name}」已被撤銷。 帶有此令牌的 iCalendar URL 無效。' + password_confirmation_dialog: + confirmation_required: "您需要輸入帳戶密碼來確認這項變更。" + title: "確認您的密碼以便繼續" news: index: no_results_title_text: 目前沒有新消息報告 @@ -1218,6 +1245,10 @@ zh-TW: onthefly: "自動新增用戶" port: "埠" tls_certificate_string: "LDAP伺服器SSL證書" + mcp_configuration: + enabled: 已啟用 + title: 標題 + description: 說明 member: roles: "角色" notification: @@ -1476,6 +1507,7 @@ zh-TW: even: "必須是偶數" exclusion: "已保留" feature_disabled: 不可用。 + feature_disabled_for_project: 對於此專案已停用。 file_too_large: "太大 (最大為 %{count} Bytes)." filter_does_not_exist: "過濾條件不存在" format: "與預期的格式“%{expected}”不符" @@ -1498,7 +1530,8 @@ zh-TW: not_a_datetime: "不是有效的日期時間。" not_a_number: "不是數字" not_allowed: "是無效的因為缺少權限" - not_json: "不是有效的 JSON 物件。" + not_json: "無法解析為 JSON。" + not_json_object: "不是 JSON 物件。" not_an_integer: "不是整數" not_an_iso_date: "不是有效日期。所需格式:YYYY-MM-DD。" not_same_project: "不屬於相同的專案" @@ -1893,7 +1926,10 @@ zh-TW: status: "工作套件狀態" token/api: other: 存取令牌(Token) - type: "類型" + token/rss: + other: "RSS 令牌(Token)" + type: + other: "類型" user: "使用者" version: "版本" workflow: "工作流程" @@ -2106,6 +2142,7 @@ zh-TW: button_click_to_reveal: "點擊顯示" button_close: "關閉" button_collapse_all: "全部收合" + button_confirm: "確認" button_configure: "設定" button_continue: "繼續" button_complete: "完成" @@ -2138,6 +2175,7 @@ zh-TW: button_print: "列印" button_quote: "引言" button_remove: 刪除 + button_remove_permanently: "永久移除" button_remove_reminder: "移除提醒" button_rename: "重新命名" button_replace: "取代" @@ -2369,7 +2407,7 @@ zh-TW: baseline_comparison: 比較差異 board_view: 進階看板 calculated_values: 計算值 - conditional_highlighting: 條件強調 + capture_external_links: 擷取外部連結 internal_comments: 內部備註 custom_actions: 自訂動作 custom_field_hierarchies: 階層 @@ -2379,10 +2417,12 @@ zh-TW: edit_attribute_groups: 編輯群組屬性 gantt_pdf_export: 以PDF匯出甘特圖 ldap_groups: 同步LDAP使用者與群組 + mcp_server: MCP 伺服器 nextcloud_sso: Nextcloud 儲存空間的單一登入(SSO) one_drive_sharepoint_file_storage: OneDrive/SharePoint 檔案儲存 placeholder_users: 佔位符使用者 portfolio_management: 組合管理 + project_creation_wizard: 專案啟動請求 project_list_sharing: 專案清單分享 readonly_work_packages: 唯讀工作套件 scim_api: SCIM 伺服器 API @@ -2423,8 +2463,8 @@ zh-TW: description: "使用參考的屬性和文字建立自動產生的主題。" customize_life_cycle: description: "建立並組織不同於 PM2 專案週期規劃所提供的專案階段。" - conditional_highlighting: - description: "想讓特定工作套件從眾多套件中脫穎而出?在工作套件列表中使用條件式醒目標示功能。" + capture_external_links: + description: "透過在使用者造訪外部連結前擷取外部連結並發出警告,防止社交工程攻擊。" work_package_query_relation_columns: description: "需要在工作套件清單中查看關聯或子套件嗎?" edit_attribute_groups: @@ -2454,6 +2494,8 @@ zh-TW: custom_actions: title: "自訂動作" description: "自訂動作是一系列預先定義動作的單鍵捷徑,您可以根據狀態、角色、類型或專案,在特定工作套件上使用這些動作。" + mcp_server: + description: "透過 MCP 將 AI 代理與您的 OpenProject 實例整合。" nextcloud_sso: title: "Nextcloud 儲存空間的單一登入(SSO)" description: "使用單一登入為您的 Nextcloud 儲存空間啟用無縫且安全的驗證。簡化存取管理並提升使用者便利性。" @@ -2465,6 +2507,8 @@ zh-TW: description: "啟用使用者透過外部 SSO 提供者(如 SAML 或 OpenID Connect)登入,以便與現有身份系統無縫整合和存取。" virus_scanning: description: "確保在其他使用者存取 OpenProject 中上傳的檔案前,對其進行病毒掃描。" + project_creation_wizard: + description: "產生一個逐步引導的精靈(Wizard),協助專案經理填寫專案啟動申請。" placeholder_users: title: 佔位符使用者 description: > @@ -2761,19 +2805,17 @@ zh-TW: learn_about: "進一步瞭解所有新功能" missing: "目前還沒有突出顯示的功能。" #We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > 該版本包含多種新功能和改進,例如: new_features_list: - line_0: 即時文件協作。 - line_1: 有能力將相關專案架構為計畫和組合,使其專注於策略目標(企業附加元件)。 - line_2: 透過草稿模式、簡報模式、增強成果和 iCal 訂閱功能,提供更佳的會議管理。 - line_3: 更新 SharePoint 整合,提供更多限制性權限 (企業附加元件)。 - line_4: 重新設計的專案總覽,新增標籤、可設定的小工具,並改善版面設計。 - line_5: 可選擇更嚴格地保護不在同一專案中工作的使用者的隱私。 - line_6: 改善專案建立流程,提供更好的範本選擇。 - line_7: 更聰明的全局搜尋,包括類型和狀態,提高多種自動完成工具的精確度。 - line_8: 改善 ALT 文字的可讀性,並改善圖表顏色。 + line_0: 自動化專案啟動(企業附加元件)。 + line_1: "會議:添加新的或現有的工作套件作為成果。" + line_2: "會議:在 OpenProject 中顯示 iCal 回應。" + line_3: "重複性會議:將議程項目重複至下次會議。" + line_4: "發佈到社群:高亮顯示屬性。" + line_5: 在使用者提供的內容中開啟外部連結前警告(企業附加元件)。 + line_6: 改善效能和使用者體驗,包括「活動」標籤和「文件」模組。 links: upgrade_enterprise_edition: "升級到企業版" postgres_migration: "將您的安裝遷移到 PostgreSQL" @@ -2841,14 +2883,17 @@ zh-TW: instructions_after_error: "你可以試著再按一次 %{signin} 來嘗試登入。如果持續發生錯誤,請向您的管理員尋求幫助。" menus: admin: - mail_notification: "電子郵件通知" - mails_and_notifications: "郵件與通知" + ai: "人工智慧 (AI)" aggregation: "合併" api_and_webhooks: "API 和 Webhook" + mail_notification: "電子郵件通知" + mails_and_notifications: "郵件與通知" + mcp_configurations: "模型上下文通訊協定 (MCP)" quick_add: label: "新增…" my_account: access_tokens: + description: "提供者令牌由 OpenProject 發行,允許其他應用程式存取。用戶端識別碼由其他應用程式發行,允許 OpenProject 存取它們。" no_results: title: "沒有可顯示的存取令牌(Token)" description: "他們全都被停用了。他們可以在管理功能表重新啟用" @@ -2858,34 +2903,56 @@ zh-TW: expiration: "過期" indefinite_expiration: "無" simple_revoke_confirmation: "你確定要撤銷此令牌(Token)?" + tabs: + client: + title: "用戶端令牌" + provider: + title: "服務提供者令牌" token/api: + blank_description: "目前還沒有 API 令牌。您可以使用下面的按鈕建立一個。" + blank_title: "無 API 令牌" title: "API" + table_title: "API 令牌(Token)" text_hint: "API 令牌(Tokens)允許第三方應用程式透過 REST API 與此 OpenProject 實例進行通訊。" - disabled_text: "API 令牌(Tokens)未由管理員啟用。若要使用此功能,請聯絡您的管理員。" - add_button: "API 令牌" - api: static_token_name: "API 令牌(Token)" + disabled_text: "API 令牌(Tokens)未由管理員啟用。若要使用此功能,請聯絡您的管理員。" + add_button: "API 令牌(Token)" ical: + blank_description: "若要新增 iCalendar 令牌,請從專案的行事曆模組中訂閱新的或現有的行事曆。您必須擁有必要的權限。" + blank_title: "沒有 iCalendar 令牌" title: "iCalendar " + table_title: "iCalendar 令牌" text_hint_link: "iCalendar 權杖可讓使用者[訂閱 OpenProject 行事曆](docs_url),並在外部用戶端中檢視最新的工作套件資訊。" disabled_text: "管理員未啟用 iCalendar 訂閱。 請聯絡您的管理員以使用此功能。" - empty_text_hint: "新增 iCalendar 令牌(Token),可訂閱各專案裡面的日曆( 需擁有相關權限)。" - oauth: + oauth_application: + active_tokens: "有效令牌" + blank_description: "沒有為您設定和啟用第三方應用程式存取。" + blank_title: "沒有 OAuth 應用程式令牌" + last_used_at: "最後使用於" title: "OAuth" - text_hint: "OAuth 令牌(Token)允許第三方應用程式與此 OpenProject 連線。" - empty_text_hint: "沒有為您設定和啟動第三方應用程式存取權限。請聯絡您的管理員以啟動此功能" - rss: - title: "RSS訂閱" - text_hint: "RSS 令牌(Token)可讓使用者透過外部 RSS 閱讀器了解本專案管理系統中最新異動。" + table_title: "OAuth 應用程式令牌" + text_hint: "OAuth 應用程式令牌允許第三方應用程式與此 OpenProject 範例連線。" + oauth_client: + blank_description: "目前還沒有 OAuth 用戶端令牌。" + blank_title: "沒有 OAuth 用戶端令牌" + failed: "發生錯誤,令牌無法移除。請稍後再試。" + integration_type: "整合類型" + table_title: "OAuth 用戶端令牌" + text_hint: "OAuth 客戶端令牌允許此 OpenProject 實例與外部應用程式連線,例如檔案儲存。" + title: "OAuth" + remove_token: "您真的要移除此令牌?您需要重新登入 %{integration}。" + removed: "成功移除 OAuth 用戶端令牌" + unknown_integration: "未知" + token/rss: + add_button: "RSS 令牌(Token)" + blank_description: "目前尚未有 RSS 令牌。您可以使用下面的按鈕建立一個。" + blank_title: "沒有 RSS 令牌" + title: "RSS" + table_title: "RSS 令牌(Token)" + text_hint: "RSS 令牌允許使用者透過外部 RSS 閱讀器,瞭解此 OpenProject 實例的最新變更。" static_token_name: "RSS 令牌(Token)" - disabled_text: "尚未啟用 RSS令牌(Token)功能。 請聯絡您的管理員。" + disabled_text: "RSS 令牌並非由管理員啟用。請聯絡您的管理員以使用此功能。" storages: - title: "檔案儲存" - text_hint: "檔案儲存區令牌(Token),可將本專案管理系統與外部檔案儲存系統連接。" - empty_text_hint: "沒有與您帳戶連動的儲存裝置存取權限。" - revoke_token: "是否確實要移除此令牌(Token)?您需要再次登錄 %{storage}" - removed: "文件存儲區令牌(Token)已成功移除" - failed: "出錯了,無法移除令牌(Token)。請稍後再試。" unknown_storage: "不明的儲存區" notifications: reasons: @@ -2947,6 +3014,7 @@ zh-TW: label_always_visible: "總是顯示" label_announcement: "公告" label_angular: "AngularJS" + label_app_modules: "%{app_title} 模組" label_api_access_key: "API金鑰" label_api_access_key_created_on: "API金鑰在 %{value} 以前被建立" label_api_access_key_type: "API" @@ -3202,6 +3270,7 @@ zh-TW: label_journal_diff: "內容對比" label_language: "語言" label_languages: "語言" + label_external_links: "外部連結" label_locale: "語言和地區" label_jump_to_a_project: "前往一個專案..." label_keyword_plural: "關鍵字" @@ -3379,9 +3448,6 @@ zh-TW: label_project_hierarchy: "專案結構" label_project_mappings: "專案" label_project_new: "新增專案" - label_project_initiation_request: "新專案啟動請求" - label_project_creation_wizard: "新專案建立精靈" - label_project_mandate: "新的專案任務" label_project_plural: "專案" label_project_list_plural: "專案列表" label_project_life_cycle: "專案生命週期" @@ -3843,7 +3909,7 @@ zh-TW: notice_not_authorized: "你沒有存取此頁面的權限" notice_not_authorized_archived_project: "你欲存取的專案已被封存" notice_requires_enterprise_token: "企業識別碼遺失或不允許存取此頁面。" - notice_password_confirmation_failed: "您的密碼不正確。無法繼續。" + notice_password_confirmation_failed: "輸入的密碼不正確。" notice_principals_found_multiple: "找到 %{number} 條結果。\n Tab鍵以轉到第一條結果。" notice_principals_found_single: "有一個結果。 \n Tab鍵轉到該結果。" notice_parent_item_not_found: "未找到父項目。" @@ -4194,6 +4260,9 @@ zh-TW: setting_allowed_link_protocols: "允許連結" setting_allowed_link_protocols_text_html: >- 允許在工作套件描述、長文字欄位與留言中,將這些協定顯示為連結。例如:%{tel_code} 或 %{element_code}。每行輸入一個協定。
    協定 %{http_code}、%{https_code} 與 %{mailto_code} 一律允許使用。 + setting_capture_external_links: "擷取外部連結" + setting_capture_external_links_text: > + 啟用後,格式化文字中的所有外部連結都會在離開應用程式前透過警告頁重定向。這有助於保護使用者遠離潛在的惡意外部網站。 setting_after_first_login_redirect_url: "首次登入重新導向" setting_after_first_login_redirect_url_text_html: > 設定使用者首次登入後的重新導向路徑。如果為空,則會重定向到上線導覽的首頁。
    範例:/my/page @@ -4206,11 +4275,17 @@ zh-TW: setting_apiv3_cors_origins_text_html: > 如果啓用了 CORS ,這些是允許訪問 OpenProject API 的源。
    請查看有關“源”標題的文檔,瞭解如何指定預期值。 setting_apiv3_write_readonly_attributes: "對唯讀屬性的寫入存取權限" - setting_apiv3_write_readonly_attributes_instructions_html: > - 若啟用,API 將允許管理員在建立時寫入靜態唯讀屬性,例如 createdAt 與 author。
    警告: 此設定適用於例如匯入資料的情境,但同時也允許管理員在建立項目時冒充其他使用者。不過,所有建立請求都會記錄實際作者。
    如需屬性與支援資源的更多資訊,請參閱 %{api_documentation_link}。 + setting_apiv3_write_readonly_attributes_instructions: > + 如果啟用,API 將允許管理員在建立時寫入靜態唯讀屬性,例如 createdAt 和 author。 + setting_apiv3_write_readonly_attributes_warning: > + 此設定可用於匯入資料,但允許管理員冒充其他使用者建立項目。所有建立請求都會以真正的作者記錄。 + setting_apiv3_write_readonly_attributes_additional: > + 有關屬性和支援資源的詳細資訊,請參閱 %{api_documentation_link}。 setting_apiv3_max_page_size: "API 每頁最大值" - setting_apiv3_max_page_instructions_html: > - 設定 API 回應的最大值。 無法執行單一頁面上傳回更多值的 API 請求。
    警告:如果您很確定,才變更該值。 設定為高值將導致效能不彰,數值過低也將造成檢視錯誤。 + setting_apiv3_max_page_size_instructions: > + 設定 API 回應的最大頁面大小。將無法執行在單一頁面上回傳更多值的 API 請求。 + setting_apiv3_max_page_size_warning: > + 請僅在確定為何需要時變更此值。設定為較高的值會導致顯著的效能影響,而低於每頁選項的值則會在分頁檢視中導致錯誤。 setting_apiv3_docs: "說明文件" setting_apiv3_docs_enabled: "啟用文件頁面" setting_apiv3_docs_enabled_instructions_html: > @@ -4395,7 +4470,7 @@ zh-TW: omniauth_direct_login_hint_html: > 如果此選項處於活動狀態,登入請求將重新導向至已設定的omniauth 提供者。登入下拉選單和登入頁面將被停用。
    注意:除非您也停用密碼登錄,否則啟用此選項後,使用者仍可透過造訪 %{internal_path} 登入頁面進行內部登入。 remapping_existing_users_hint: > - 若啟用,將允許任何已設定的身份提供者根據使用者的電子郵件登入,即使該使用者之前從未透過該提供者登入過。這在將 OpenProject 實例遷移到新的 SSO 提供者時非常有用,但若使用的提供者並非所有使用者都信任,則不建議啟用此功能。 + 如果啟用,允許任何已設定的身分提供者根據使用者名稱登入現有使用者,即使使用者之前從未透過該提供者登入。這在將 OpenProject 實例遷移至新的 SSO 提供者時可能很有用,但在使用並非所有實例使用者都信任的提供者時,則不建議使用。 attachments: whitelist_text_html: > 為上傳的文件定義有效文件副檔名和/或 MIME 類型的列表。
    輸入文件副檔名(例如 %{ext_example})或 MIME 類型(例如 %{mime_example})。
    留空以允許上傳任何文件類型。允許多個值(每個值一行)。 @@ -4501,7 +4576,7 @@ zh-TW: project_mandate: "項目任務" submission: description_template: > - **此工作套件是在 %{wizard_name} 工作流程完成後自動建立的。** 一個包含所有提交資訊的 PDF 成品已經生成,並附加到此工作套件中,以供參考和稽核之用。 如果您需要更新或重新執行啟動步驟,您可以隨時使用下方的連結重新開啟該精靈: + 此工作套件是在完成 %{wizard_name} 工作流程後自動建立的。 系統已產生一份包含所有已提交資訊的 PDF 成品,並已附加至此工作套件,供日後查閱與稽核使用。 若您需要更新內容或重新執行啟動步驟,可隨時透過下方連結重新開啟精靈: description: "當使用者提交專案啟動請求時,將會建立一個新的工作套件,並將請求成品以 PDF 檔案的形式附加到其中。下方的設定將定義這個新工作套件的類型、狀態和指派對象。" work_package_type: "工作套件類型" work_package_type_caption: "應用於儲存已完成成品之工作套件的類型。" @@ -4669,6 +4744,7 @@ zh-TW: 注:如果啓用,這會在 %{information_panel_label} 管理面板中和首頁上顯示一個包含您的安裝狀態的徽章。徽章僅向管理員顯示。
    徽章將根據官方的 OpenProject 版本數據庫檢查您當前的 OpenProject 版本,提醒您是否存在任何更新或已知漏洞。如需詳細瞭解檢查可以提供哪些信息,需要哪些數據來提供可用更新,以及如何禁用此檢查,請訪問配置文檔。 text_own_membership_delete_confirmation: "您將要刪除部分或全部權限, 之後可能無法再編輯此專案。\n是否要繼續?" text_permanent_delete_confirmation_checkbox_label: "我了解此刪除無法逆轉" + text_permanent_remove_confirmation_checkbox_label: "我了解此移除無法逆轉" text_plugin_assets_writable: "Plugin 資產目錄可寫" text_powered_by: "由 %{link} 提供" text_project_identifier_info: "僅允許小寫字母(a-z)、數字、破折號(-) 及底線(_),且必須以小寫字母開頭。" @@ -5163,3 +5239,8 @@ zh-TW: token: hashed_token: display_value_placeholder: "***" + external_link_warning: + title: "離開 OpenProject" + warning_message: "您即將離開 OpenProject 並訪問外部網站。請注意,外部網站不受我們控制,可能有不同的隱私和安全政策。" + continue_message: "您確定要前往下列外部連結嗎?" + continue_button: "繼續到外部網站" diff --git a/config/locales/en.yml b/config/locales/en.yml index e4487b5d002..7e3b962b210 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -118,6 +118,23 @@ en: 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." link: "webhook" + mcp_configurations: + index: + description: "The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance." + resources_heading: "Resources" + resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)." + resources_submit: "Update resources" + tools_heading: "Tools" + tools_description: "OpenProject implements the following tools. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP tools](docs_url)." + tools_submit: "Update tools" + multi_update: + success: "MCP configurations were updated successfully." + server_form: + description_caption: "How the MCP server will be described to other applications who connect to it." + title_caption: "A short title shown to applications that connect to the MCP server." + update: + failure: "MCP configuration could not be updated." + success: "MCP configuration was updated successfully." scim_clients: authentication_methods: sso: "JWT from identity provider" @@ -598,8 +615,8 @@ en: members: excluded_roles_label: "Roles to exclude when template is applied" excluded_roles_caption: > - When creating a new project from this template, the roles selected above will be omitted. - This allows you to select which members will be excluded based on their project roles. + When creating a new project from this template, the roles selected above will be omitted. + This allows you to select which members will be excluded based on their project roles. Users can then access the template for viewing purposes without being granted access to new projects created from it. actions: label_enable_all: "Enable all" @@ -639,6 +656,7 @@ en: is_for_all_blank_slate: heading: For all projects description: This project attribute is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. + enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests. types: no_results_title_text: There are currently no types available. form: @@ -653,6 +671,9 @@ en: work_package_priorities: new_label: "New priority" creation_wizard: + errors: + no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project." + no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type." export: description_attachment_export: "The generated artifact will be saved as a PDF attachment to the artifact work package." description_file_link_export: "The artifact work package will have a file link to a PDF stored in an external file storage. Requires a working file storage with automatically-managed project folders for this project. At the moment only Nextcloud file storages are supported." @@ -667,6 +688,7 @@ en: project_attributes_description: > Select which project attributes should be included in the project initiation request. This list only includes [project attributes](project_attributes_url) enabled for for this project. + enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance. status: button_edit: Edit status wizard: @@ -764,9 +786,11 @@ en: create_button: "Create" name_label: "Token name" created_dialog: + one_time_warning: "This is the only time you will see this token. Make sure to copy it now." token/api: title: "The API token has been generated" - warning: "This is the only time you will see this token. Make sure to copy it now." + token/rss: + title: "The RSS token has been generated" failed_to_reset_token: "Failed to reset access token: %{error}" failed_to_create_token: "Failed to create access token: %{error}" failed_to_revoke_token: "Failed to revoke access token: %{error}" @@ -776,6 +800,9 @@ en: notice_api_token_revoked: "The API token has been deleted. To create a new token please use the button in the API section." notice_rss_token_revoked: "The RSS token has been deleted. To create a new token please use the link in the RSS section." notice_ical_token_revoked: 'iCalendar token "%{token_name}" for calendar "%{calendar_name}" of project "%{project_name}" has been revoked. The iCalendar URL with this token is now invalid.' + password_confirmation_dialog: + confirmation_required: "You need to enter your account password to confirm this change." + title: "Confirm your password to continue" news: index: @@ -1326,6 +1353,10 @@ en: onthefly: "Automatic user creation" port: "Port" tls_certificate_string: "LDAP server SSL certificate" + mcp_configuration: + enabled: Enabled + title: Title + description: Description member: roles: "Roles" notification: @@ -1585,6 +1616,7 @@ en: even: "must be even." exclusion: "is reserved." feature_disabled: is not available. + feature_disabled_for_project: is disabled for this project. file_too_large: "is too large (maximum size is %{count} Bytes)." filter_does_not_exist: "filter does not exist." format: "does not match the expected format '%{expected}'." @@ -1607,7 +1639,8 @@ en: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - not_json: "is not a valid JSON object." + not_json: "is not parseable as JSON." + not_json_object: "is not a JSON object." not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." @@ -2018,7 +2051,12 @@ en: token/api: one: Access token other: Access tokens - type: "Type" + token/rss: + one: "RSS token" + other: "RSS tokens" + type: + one: "Type" + other: "Types" user: "User" version: "Version" workflow: "Workflow" @@ -2245,6 +2283,7 @@ en: button_click_to_reveal: "Click to reveal" button_close: "Close" button_collapse_all: "Collapse all" + button_confirm: "Confirm" button_configure: "Configure" button_continue: "Continue" button_complete: "Complete" @@ -2277,6 +2316,7 @@ en: button_print: "Print" button_quote: "Quote" button_remove: Remove + button_remove_permanently: "Remove permanently" button_remove_reminder: "Remove reminder" button_rename: "Rename" button_replace: "Replace" @@ -2542,7 +2582,7 @@ en: baseline_comparison: Baseline Comparisons board_view: Advanced Boards calculated_values: Calculated values - conditional_highlighting: Conditional Highlighting + capture_external_links: Capture External Links internal_comments: Internal Comments custom_actions: Custom Actions custom_field_hierarchies: Hierarchies @@ -2552,10 +2592,12 @@ en: edit_attribute_groups: Edit Attribute Groups gantt_pdf_export: Gantt PDF Export ldap_groups: LDAP users and group sync + mcp_server: MCP Server nextcloud_sso: Single Sign-On for Nextcloud Storage one_drive_sharepoint_file_storage: OneDrive/SharePoint File Storage placeholder_users: Placeholder Users portfolio_management: Portfolio management + project_creation_wizard: Project initiation request project_list_sharing: Project List Sharing readonly_work_packages: Readonly Work Packages scim_api: SCIM server API @@ -2597,8 +2639,8 @@ en: description: "Create automatically generated subjects using referenced attributes and text." customize_life_cycle: description: "Create and organize different project phases than the ones provided by PM2 project cycle planning." - conditional_highlighting: - description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table." + capture_external_links: + description: "Prevent social engineering attacks by capturing and warning about external links before users visit them." work_package_query_relation_columns: description: "Need to see relations or child elements in the work package list?" edit_attribute_groups: @@ -2628,6 +2670,8 @@ en: custom_actions: title: "Custom actions" description: "Custom actions are one-click shortcuts to a set of pre-defined actions that you can make available on certain work packages based on status, role, type or project." + mcp_server: + description: "Integrate AI agents with your OpenProject instance through MCP." nextcloud_sso: title: "Single Sign-On for Nextcloud Storage" description: "Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience." @@ -2639,6 +2683,8 @@ en: description: "Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems." virus_scanning: description: "Ensure uploaded files in OpenProject are scanned for viruses before being accessible by other users." + project_creation_wizard: + description: "Generate a step-by-step wizard to help project managers fill out a project initiation request." placeholder_users: title: Placeholder users description: > @@ -2954,19 +3000,17 @@ en: learn_about: "Learn more about all new features" missing: "There are no highlighted features yet." # We need to include the version to invalidate outdated translations in other locales - "17_0": + "17_1": new_features_title: > The release contains various new features and improvements, such as: new_features_list: - line_0: Real-time documents collaboration. - line_1: Ability to structure related projects into programs and portfolios to focus them on strategic goals (Enterprise add-on). - line_2: Better meeting management with draft mode, presentation mode, enhanced outcomes, and iCal subscription. - line_3: Updated SharePoint integration with more restrictive permissions (Enterprise add-on). - line_4: Redesigned project overview with new tabs, configurable widgets, and an improved layout. - line_5: Option to guard the privacy of users not working in the same project more strictly. - line_6: Improved project creation flow with better template selection. - line_7: Smarter global search including type and status, improving precision in several autocompleters. - line_8: Accessibility improvements with ALT texts and improved chart colors. + line_0: Automated project initiation (Enterprise add-on). + line_1: "Meetings: add new or existing work packages as outcomes." + line_2: "Meetings: show iCal responses in OpenProject." + line_3: "Recurring meetings: duplicate agenda items to the next occurrence." + line_4: "Release to Community: Attribute highlighting." + line_5: Warning before opening external links in user-provided content (Enterprise add-on). + line_6: Improved performance and user experience, including the Activity tab and Documents module. links: upgrade_enterprise_edition: "Upgrade to Enterprise edition" postgres_migration: "Migrating your installation to PostgreSQL" @@ -3041,15 +3085,18 @@ en: menus: admin: - mail_notification: "Email notifications" - mails_and_notifications: "Emails and notifications" + ai: "Artificial Intelligence (AI)" aggregation: "Aggregation" api_and_webhooks: "API and webhooks" + mail_notification: "Email notifications" + mails_and_notifications: "Emails and notifications" + mcp_configurations: "Model Context Protocol (MCP)" quick_add: label: "Add…" my_account: access_tokens: + description: "Provider tokens are issued by OpenProject, allowing other applications to access it. Client tokens are issued by other applications, allowing OpenProject to access them." no_results: title: "No access tokens to display" description: "All of them have been disabled. They can be re-enabled in the administration menu." @@ -3059,34 +3106,56 @@ en: expiration: "Expires" indefinite_expiration: "Never" simple_revoke_confirmation: "Are you sure you want to revoke this token?" + tabs: + client: + title: "Client tokens" + provider: + title: "Provider tokens" token/api: + blank_description: "There is no API token yet. You can create one using the button below." + blank_title: "No API token" title: "API" + table_title: "API tokens" text_hint: "API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs." - disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." - add_button: "API Token" - api: static_token_name: "API token" + disabled_text: "API tokens are not enabled by the administrator. Please contact your administrator to use this feature." + add_button: "API token" ical: + blank_description: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." + blank_title: "No iCalendar token" title: "iCalendar" + table_title: "iCalendar tokens" text_hint_link: "iCalendar tokens allow users to [subscribe to OpenProject calendars](docs_url) and view up-to-date work package information from external clients." disabled_text: "iCalendar subscriptions are not enabled by the administrator. Please contact your administrator to use this feature." - empty_text_hint: "To add an iCalendar token, subscribe to a new or existing calendar from within the Calendar module of a project. You must have the necessary permissions." - oauth: + oauth_application: + active_tokens: "Active tokens" + blank_description: "There is no third-party application access configured and active for you." + blank_title: "No OAuth application token" + last_used_at: "Last used at" title: "OAuth" - text_hint: "OAuth tokens allow third-party applications to connect with this OpenProject instance." - empty_text_hint: "There is no third-party application access configured and active for you. Please contact your administrator to activate this feature." - rss: + table_title: "OAuth application tokens" + text_hint: "OAuth application tokens allow third-party applications to connect with this OpenProject instance." + oauth_client: + blank_description: "There are no OAuth client tokens yet." + blank_title: "No OAuth client tokens" + failed: "An error occurred and the token couldn't be removed. Please try again later." + integration_type: "Integration type" + table_title: "OAuth client tokens" + text_hint: "OAuth client tokens allow this OpenProject instance to connect with external applications, such as file storages." + title: "OAuth" + remove_token: "Do you really want to remove this token? You will need to login again on %{integration}." + removed: "OAuth client token successfully removed" + unknown_integration: "Unknown" + token/rss: + add_button: "RSS token" + blank_description: "There is no RSS token yet. You can create one using the button below." + blank_title: "No RSS token" title: "RSS" + table_title: "RSS tokens" text_hint: "RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader." static_token_name: "RSS token" disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature." storages: - title: "File storages" - text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage." - empty_text_hint: "There is no storage access linked to your account." - revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}" - removed: "File Storage token successfully removed" - failed: "An error occurred and the token couldn't be removed. Please try again later." unknown_storage: "Unknown storage" notifications: @@ -3406,6 +3475,7 @@ en: label_journal_diff: "Description Comparison" label_language: "Language" label_languages: "Languages" + label_external_links: "External links" label_locale: "Language and region" label_jump_to_a_project: "Jump to a project..." label_keyword_plural: "Keywords" @@ -3583,9 +3653,6 @@ en: label_project_hierarchy: "Project hierarchy" label_project_mappings: "Projects" label_project_new: "New project" - label_project_initiation_request: "New project initiation request" - label_project_creation_wizard: "New project creation wizard" - label_project_mandate: "New project mandate" label_project_plural: "Projects" label_project_list_plural: "Project lists" label_project_life_cycle: "Project life cycle" @@ -4057,7 +4124,7 @@ en: notice_not_authorized: "You are not authorized to access this page." notice_not_authorized_archived_project: "The project you're trying to access has been archived." notice_requires_enterprise_token: "Enterprise token missing or doesn't allow access to this page." - notice_password_confirmation_failed: "Your password is not correct. Cannot continue." + notice_password_confirmation_failed: "The entered password is not correct." notice_principals_found_multiple: "There are %{number} results found. \n Tab to focus the first result." notice_principals_found_single: "There is one result. \n Tab to focus it." notice_parent_item_not_found: "Parent item not found." @@ -4433,6 +4500,10 @@ en: For example, %{tel_code} or %{element_code}. Enter one protocol per line.
    Protocols %{http_code}, %{https_code}, and %{mailto_code} are always allowed. + setting_capture_external_links: "Capture external links" + setting_capture_external_links_text: > + When enabled, all external links in formatted text will redirect through a warning page + before leaving the application. This helps protect users from potentially malicious external websites. setting_after_first_login_redirect_url: "First login redirect" setting_after_first_login_redirect_url_text_html: > Set a path to redirect users after their first login. If empty, redirects to the home page for the onboarding tour. @@ -4451,21 +4522,21 @@ en:
    Please check the Documentation on the Origin header on how to specify the expected values. setting_apiv3_write_readonly_attributes: "Write access to read-only attributes" - setting_apiv3_write_readonly_attributes_instructions_html: > + setting_apiv3_write_readonly_attributes_instructions: > 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 + setting_apiv3_write_readonly_attributes_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. -
    + setting_apiv3_write_readonly_attributes_additional: > For more information on attributes and supported resources, please see the %{api_documentation_link}. setting_apiv3_max_page_size: "Maximum API page size" - setting_apiv3_max_page_instructions_html: > + setting_apiv3_max_page_size_instructions: > Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. -
    - Warning: Please only change this value if you are sure why you need it. + setting_apiv3_max_page_size_warning: > + Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. setting_apiv3_docs: "Documentation" @@ -4673,7 +4744,7 @@ en: Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path} login page. remapping_existing_users_hint: > - If enabled, allows any configured identity provider to login existing users based on their email address, + If enabled, allows any configured identity provider to login existing users based on their username, even if the user never signed in through that provider before. This can be useful when migrating the OpenProject instance to a new SSO provider, but is not recommended when using a provider that is not trusted by all users of your instance. attachments: @@ -4777,7 +4848,7 @@ en: description: "Add all the project attributes in a section inside the right side panel in the project overview." project_initiation_request: header_description: > - OpenProject can generate a step-by-step wizard to help project managers fill out a project initiation request. + OpenProject can generate a step-by-step wizard to help project managers fill out a project initiation request. You can choose which project attributes should be included and create a PDF artifact as a result. status: submitted: "%{wizard_name} has been submitted" @@ -4808,7 +4879,7 @@ en: description_template: > **This work package was automatically created upon completion of the %{wizard_name} workflow.** - A PDF artefact containing all submitted information has been generated and attached to this work package for reference and audit purposes. + A PDF artifact containing all submitted information has been generated and attached to this work package for reference and audit purposes. If you need to update or re-run the initiation steps, you can reopen the wizard at any time by using the link below: description: "When a user submits a project initiation request, a new work package will be created with the request artifact attached as a PDF file. The settings below define the type, status and assignee for this new work package." @@ -5007,6 +5078,7 @@ en: 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: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed" + text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed" text_plugin_assets_writable: "Plugin assets directory writable" text_powered_by: "Powered by %{link}" text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter." @@ -5566,3 +5638,9 @@ en: token: hashed_token: display_value_placeholder: "***" + + external_link_warning: + title: "Leaving OpenProject" + warning_message: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies." + continue_message: "Are you sure you want to proceed to the following external link?" + continue_button: "Continue to external website" diff --git a/config/locales/js-en.yml b/config/locales/js-en.yml index e443525492a..b4fa4cc290d 100644 --- a/config/locales/js-en.yml +++ b/config/locales/js-en.yml @@ -677,10 +677,6 @@ en: already_selected: "This project is already selected" remove: "Remove project settings" - password_confirmation: - field_description: "You need to enter your account password to confirm this change." - title: "Confirm your password to continue" - pagination: no_other_page: "You are on the only page." pages_skipped: "Pages skipped." diff --git a/config/routes.rb b/config/routes.rb index e3c88303dc0..9d6891ed2ad 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -45,6 +45,8 @@ Rails.application.routes.draw do get "/api/docs" => "api_docs#index" + mount API::Mcp => "/mcp" + # Redirect deprecated issue links to new work packages uris get "/issues(/)" => redirect("#{rails_relative_url_root}/work_packages") # The URI.escape doesn't escape / unless you ask it to. @@ -73,6 +75,9 @@ Rails.application.routes.draw do get "/auth/:provider", to: proc { [404, {}, [""]] }, as: "omni_auth_start" match "/auth/:provider/callback", to: "omni_auth_login#callback", as: "omni_auth_callback", via: %i[get post] + get "/.well-known/oauth-authorization-server", to: "oauth_metadata#authorization_server", as: :authorization_server_metadata + get "/.well-known/oauth-protected-resource", to: "oauth_metadata#protected_resource", as: :protected_resource_metadata + # In case assets are actually delivered by a node server (e.g. in test env) # forward requests to the proxy if FrontendAssetHelper.assets_proxied? @@ -120,6 +125,8 @@ Rails.application.routes.draw do post "/account/confirm_consent", action: "confirm_consent", as: "account_confirm_consent" end + get "/external_redirect", to: "external_link_warning#show", as: "external_redirect" + resources :attribute_help_texts, only: [] do member do get :show_dialog @@ -367,10 +374,6 @@ Rails.application.routes.draw do post :deactivate_work_package_attachments end - collection do - get :export_list_modal - end - resources :versions, only: %i[new create] do collection do put :close_completed @@ -609,6 +612,12 @@ Rails.application.routes.draw do end end + resources :mcp_configurations, only: %i[index update], controller: "admin/mcp_configurations" do + collection do + post :multi_update + end + end + resources :custom_actions, except: :show namespace :oauth do @@ -624,6 +633,7 @@ Rails.application.routes.draw do namespace :settings do resource :general, controller: "/admin/settings/general_settings", only: %i[show update] resource :languages, controller: "/admin/settings/languages_settings", only: %i[show update] + resource :external_links, controller: "/admin/settings/external_links_settings", only: %i[show update] resource :repositories, controller: "/admin/settings/repositories_settings", only: %i[show update] resource :experimental, controller: "/admin/settings/experimental_settings", only: %i[show update] @@ -753,10 +763,11 @@ Rails.application.routes.draw do get "menu" => "menus#show" match "auto_complete" => "auto_completes#index", via: %i[get post] - resource :bulk, controller: "bulk", only: %i[edit update destroy] - # FIXME: this is kind of evil!! We need to remove this soonest and - # cover the functionality. Route is being used in work-package-service.js:331 - get "/bulk" => "bulk#destroy" + resource :bulk, controller: "bulk", only: %i[edit update destroy] do + collection do + match :reassign, via: %i[get delete] + end + end end resources :work_packages, only: %i[index show new] do @@ -962,15 +973,16 @@ Rails.application.routes.draw do post :generate_api_key end + delete :remove_oauth_client_token delete :revoke_api_key delete :revoke_ical_token - delete :revoke_storage_token delete :revoke_ical_meeting_token end end scope controller: "my" do get "/my/password", action: "password" + get "/my/password_confirmation_dialog", action: "password_confirmation_dialog" post "/my/change_password", action: "change_password" get "/my/account", action: "account" diff --git a/config/static_links.yml b/config/static_links.yml index 7f8c4f76242..807e1b478d3 100644 --- a/config/static_links.yml +++ b/config/static_links.yml @@ -42,14 +42,10 @@ docker_installation: documents_docs: href: https://www.openproject.org/docs/user-guide/documents/ enterprise_features: - attribute_highlighting: - href: https://www.openproject.org/docs/user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-enterprise-add-on board_view: href: https://www.openproject.org/docs/user-guide/agile-boards/#action-boards-enterprise-add-on boards: href: https://www.openproject.org/docs/user-guide/agile-boards/#action-boards-enterprise-add-on - conditional_highlighting: - href: https://www.openproject.org/enterprise-edition/?op_referrer=settings-wp-attribute-highlighting#attribute-highlighting custom_field_hierarchies: href: https://www.openproject.org/docs/system-admin-guide/custom-fields/#hierarchy-custom-field-enterprise-add-on custom_field_multiselect: @@ -107,6 +103,8 @@ manual_installation: newsletter: href: https://www.openproject.org/newsletter label: homescreen.links.newsletter +oauth_applications: + href: https://www.openproject.org/docs/system-admin-guide/authentication/oauth-applications/ security_alerts: href: https://www.openproject.org/security-and-privacy/#mailing-list label: homescreen.links.security_alerts @@ -179,6 +177,10 @@ sysadmin_docs: href: https://www.openproject.org/docs/system-admin-guide/users-permissions/roles-permissions/#roles-and-permissions ldap: href: https://www.openproject.org/docs/system-admin-guide/authentication/ldap-connections/ + mcp_resources: + href: https://www.openproject.org/docs/system-admin-guide/integrations/mcp-server/#resources + mcp_tools: + href: https://www.openproject.org/docs/system-admin-guide/integrations/mcp-server/#tools oidc: href: https://www.openproject.org/docs/system-admin-guide/authentication/openid-providers/ oidc_acr_values: @@ -223,8 +225,9 @@ user_guides: href: https://www.openproject.org/docs/user-guide/ label: homescreen.links.user_guides user_guide: - access_tokens: - href: https://www.openproject.org/docs/user-guide/account-settings/#access-tokens + calendar: + subscribe: + href: https://www.openproject.org/docs/user-guide/calendar/#subscribe-to-a-calendar webinar_videos: href: https://www.youtube.com/watch?v=un6zCm8_FT4 website: diff --git a/db/migrate/20251218133700_create_mcp_configurations.rb b/db/migrate/20251218133700_create_mcp_configurations.rb new file mode 100644 index 00000000000..dec733e2b1a --- /dev/null +++ b/db/migrate/20251218133700_create_mcp_configurations.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class CreateMcpConfigurations < ActiveRecord::Migration[8.0] + def change + create_table :mcp_configurations do |t| + t.string :identifier, null: false + t.string :title, null: false + t.string :description, null: false + t.boolean :enabled, null: false, default: false + t.timestamps null: false + end + end +end diff --git a/db/migrate/20260122130916_fix_uniqueness_on_enumerations.rb b/db/migrate/20260122130916_fix_uniqueness_on_enumerations.rb index b54206941e1..88cdac4cf70 100644 --- a/db/migrate/20260122130916_fix_uniqueness_on_enumerations.rb +++ b/db/migrate/20260122130916_fix_uniqueness_on_enumerations.rb @@ -1,5 +1,33 @@ # frozen_string_literal: true +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + class FixUniquenessOnEnumerations < ActiveRecord::Migration[8.0] disable_ddl_transaction! diff --git a/db/migrate/20260130105057_add_uniqueness_for_watchers_table.rb b/db/migrate/20260130105057_add_uniqueness_for_watchers_table.rb new file mode 100644 index 00000000000..e6037427041 --- /dev/null +++ b/db/migrate/20260130105057_add_uniqueness_for_watchers_table.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ +class AddUniquenessForWatchersTable < ActiveRecord::Migration[8.0] + disable_ddl_transaction! + + def up + execute <<~SQL.squish + DELETE FROM watchers w1 + USING watchers w2 + WHERE w1.id > w2.id + AND w1.user_id = w2.user_id + AND w1.watchable_type = w2.watchable_type + AND w1.watchable_id = w2.watchable_id; + SQL + + add_index :watchers, ["user_id", "watchable_type", "watchable_id"], + unique: true, + algorithm: :concurrently, + name: "index_watchers_on_user_id_and_watchable" + end + + def down + remove_index :watchers, name: "index_watchers_on_user_id_and_watchable", algorithm: :concurrently + end +end diff --git a/docker-compose.yml b/docker-compose.yml index 5e1c57b92a2..12ef9b8fb3a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -87,7 +87,7 @@ services: networks: - network environment: - __VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS: "openproject-assets.local" + __VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS: "openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}" ports: - "${FE_PORT:-4200}:4200" @@ -166,7 +166,7 @@ services: SELENIUM_GRID_URL: http://selenium-hub:4444/wd/hub CHROME_WS_URL: ws://cuprite-chrome:3000/chrome CAPYBARA_SERVER_PORT: 3000 - CAPYBARA_DYNAMIC_BIND_IP: 1 + CAPYBARA_BIND_ADDRESS: "0.0.0.0" CAPYBARA_APP_HOSTNAME: backend-test OPENPROJECT_EMAIL__DELIVERY__METHOD: test OPENPROJECT_CLI_PROXY: http://frontend-test:4200 diff --git a/docker/ci/Dockerfile b/docker/ci/Dockerfile index 6603fed78d4..285338476ed 100644 --- a/docker/ci/Dockerfile +++ b/docker/ci/Dockerfile @@ -11,12 +11,15 @@ RUN apt-get update -qq && \ apt-get install -y wget gnupg lsb-release curl && \ wget --quiet -O- https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgrsql.gpg - && \ echo "deb [signed-by=/usr/share/keyrings/postgrsql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list -# Temporarily use a mirror for Chrome until the official one no longer has issues with xeokit. Can be tested by running -# rspec ./modules/bim/spec/features/bcf/create_spec.rb:107 after switching to the official package source. -ENV CHROME_SOURCE_URL="https://mirror.cs.uchicago.edu/google-chrome/pool/main/g/google-chrome-stable/google-chrome-stable_142.0.7444.134-1_amd64.deb" -RUN --mount=type=cache,target=/var/cache/apt export f="/tmp/chrome.deb" && wget --no-verbose -O $f $CHROME_SOURCE_URL && \ - apt-get update -qq && apt-get install -y "$f" postgresql-$PGVERSION postgresql-client-$PGVERSION time imagemagick default-jre-headless firefox-esr && \ - rm -f "$f" && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/lib/postgresql && find /usr/share/locale/* -maxdepth 0 -type d ! -name 'en' -exec rm -rf {} \; +ENV CHROME_SOURCE_URL="https://dl.google.com/dl/linux/direct/google-chrome-stable_current_amd64.deb" +RUN --mount=type=cache,target=/var/cache/apt export f="/tmp/chrome.deb" && \ + wget --no-verbose -O $f $CHROME_SOURCE_URL && \ + apt-get update -qq && \ + apt-get install -y "$f" postgresql-$PGVERSION postgresql-client-$PGVERSION time imagemagick default-jre-headless firefox-esr && \ + rm -f "$f" && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/lib/postgresql && \ + find /usr/share/locale/* -maxdepth 0 -type d ! -name 'en' -exec rm -rf {} \; RUN curl -L https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz -o - | tar xJf - -C /usr/local --strip=1 && node --version @@ -34,7 +37,7 @@ RUN groupadd --force --gid $APP_USER_GID $APP_USER && \ ENV CI=true ENV RAILS_ENV=test ENV OPENPROJECT_DISABLE_DEV_ASSET_PROXY=1 -ENV CAPYBARA_DYNAMIC_BIND_IP=1 +ENV CAPYBARA_BIND_ADDRESS=0.0.0.0 ENV CAPYBARA_DOWNLOADED_FILE_DIR=/tmp # disable deprecations and other warnings in output ENV RUBYOPT="-W0" diff --git a/docker/dev/backend/scripts/setup-bim b/docker/dev/backend/scripts/setup-bim index a2b56158269..7b9c2c40d40 100755 --- a/docker/dev/backend/scripts/setup-bim +++ b/docker/dev/backend/scripts/setup-bim @@ -9,14 +9,6 @@ apt-get install -y wget unzip -# https://learn.microsoft.com/en-gb/dotnet/core/install/linux-debian#debian-12 -wget --no-verbose --tries 3 https://packages.microsoft.com/config/debian/12/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 @@ -33,7 +25,7 @@ wget --no-verbose --tries 3 https://s3.amazonaws.com/ifcopenshell-builds/IfcConv unzip -q IfcConvert-v0.7.11-fea8e3a-linux64.zip mv IfcConvert "/usr/local/bin/IfcConvert" -wget --no-verbose --tries 3 https://github.com/bimspot/xeokit-metadata/releases/download/1.0.1/xeokit-metadata-linux-x64.tar.gz +wget --no-verbose --tries 3 https://github.com/opf/xeokit-metadata/releases/download/v1.1.0/xeokit-metadata-linux-x64.tar.gz tar -zxvf xeokit-metadata-linux-x64.tar.gz chmod +x xeokit-metadata-linux-x64/xeokit-metadata cp -r xeokit-metadata-linux-x64/ "/usr/lib/xeokit-metadata" diff --git a/docker/dev/gitlab/.env b/docker/dev/gitlab/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/gitlab/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/gitlab/docker-compose.yml b/docker/dev/gitlab/docker-compose.yml index 7389f4ed4eb..42ad0f3eb6a 100644 --- a/docker/dev/gitlab/docker-compose.yml +++ b/docker/dev/gitlab/docker-compose.yml @@ -19,10 +19,10 @@ services: networks: - external extra_hosts: - - "openproject.local:host-gateway" + - "openproject.${OPENPROJECT_DOCKER_DEV_TLD}:host-gateway" labels: - "traefik.enable=true" - - "traefik.http.routers.gitlab.rule=Host(`gitlab.local`)" + - "traefik.http.routers.gitlab.rule=Host(`gitlab.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.gitlab.entrypoints=websecure" - "traefik.http.services.gitlab.loadbalancer.server.port=80" diff --git a/docker/dev/hocuspocus/.env b/docker/dev/hocuspocus/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/hocuspocus/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/hocuspocus/docker-compose.yml b/docker/dev/hocuspocus/docker-compose.yml index 5f75b31f3db..4419c6e4365 100644 --- a/docker/dev/hocuspocus/docker-compose.yml +++ b/docker/dev/hocuspocus/docker-compose.yml @@ -2,18 +2,19 @@ services: hocuspocus: # In case of MacOS you need to specify the platform in your `docker/dev/hocuspocus/docker-compose.override.yml`: # platform: linux/amd64 - image: openproject/hocuspocus:main-defdb238 + image: openproject/hocuspocus:latest labels: - "traefik.enable=true" - - "traefik.http.routers.hocuspocus.rule=Host(`hocuspocus.local`)" + - "traefik.http.routers.hocuspocus.rule=Host(`hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.hocuspocus.service=hocuspocus-service" - "traefik.http.routers.hocuspocus.tls=true" - "traefik.http.services.hocuspocus-service.loadbalancer.server.port=1234" - "traefik.http.routers.hocuspocus.tls.certresolver=step" + restart: unless-stopped networks: - gateway environment: - - ALLOWED_DOMAINS=openproject.local,localhost + - ALLOWED_DOMAINS=openproject.${OPENPROJECT_DOCKER_DEV_TLD},localhost - NODE_TLS_REJECT_UNAUTHORIZED=0 - SECRET=secret12345 networks: diff --git a/docker/dev/keycloak/.env b/docker/dev/keycloak/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/keycloak/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/keycloak/docker-compose.yml b/docker/dev/keycloak/docker-compose.yml index a8cd4d2803a..4c5bf556edc 100644 --- a/docker/dev/keycloak/docker-compose.yml +++ b/docker/dev/keycloak/docker-compose.yml @@ -35,7 +35,7 @@ services: - KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN_PASSWORD=admin - KC_DB_SCHEMA=public - - KC_HOSTNAME=keycloak.local + - KC_HOSTNAME=keycloak.${OPENPROJECT_DOCKER_DEV_TLD} - KC_TRANSACTION_XA_ENABLED=false volumes: - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro @@ -43,10 +43,8 @@ services: - ./themes/:/opt/keycloak/themes/ labels: - "traefik.enable=true" - - "traefik.http.routers.keycloak-sub-secure.rule=Host(`keycloak.local`)" + - "traefik.http.routers.keycloak-sub-secure.rule=Host(`keycloak.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.keycloak-sub-secure.entrypoints=websecure" - - "traefik.http.routers.keycloak-sub-secure.tls=true" - - "traefik.http.routers.keycloak-sub-secure.tls.certresolver=step" depends_on: - db-keycloak diff --git a/docker/dev/minio/.env b/docker/dev/minio/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/minio/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/minio/docker-compose.yml b/docker/dev/minio/docker-compose.yml index 778277abfc6..cecc8ee8df9 100644 --- a/docker/dev/minio/docker-compose.yml +++ b/docker/dev/minio/docker-compose.yml @@ -19,13 +19,13 @@ services: - "traefik.enable=true" # MinIO API - "traefik.http.routers.minio.entrypoints=websecure" - - "traefik.http.routers.minio.rule=Host(`minio.local`)" + - "traefik.http.routers.minio.rule=Host(`minio.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.minio.service=minio" - "traefik.http.routers.minio.tls.certresolver=step" - "traefik.http.services.minio.loadbalancer.server.port=9000" # MinIO Admin Console (Management UI) - "traefik.http.routers.minioadmin.entrypoints=websecure" - - "traefik.http.routers.minioadmin.rule=Host(`minioadmin.local`)" + - "traefik.http.routers.minioadmin.rule=Host(`minioadmin.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.minioadmin.service=minioadmin" - "traefik.http.routers.minioadmin.tls.certresolver=step" - "traefik.http.services.minioadmin.loadbalancer.server.port=9001" diff --git a/docker/dev/nextcloud/.env b/docker/dev/nextcloud/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/nextcloud/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/nextcloud/README.md b/docker/dev/nextcloud/README.md index 98a046d12e0..10a2b10b49f 100644 --- a/docker/dev/nextcloud/README.md +++ b/docker/dev/nextcloud/README.md @@ -4,12 +4,13 @@ A minimal setup to run a Nextcloud inside the TLS-enabled docker development sta 1. Allow accessing OP through `openproject.local`: * `docker compose exec --user www-data nextcloud php occ config:system:set allow_local_remote_servers --value 1` + * If using an alternative hostname: `docker compose exec --user www-data nextcloud php occ config:system:set trusted_domains 1 --value=nextcloud.example.com` 2. Import Dev CA cert into Nextcloud's own certificate store: * `docker compose cp /path/to/your/OpenProject_Development_Root_CA.crt nextcloud:/tmp/root.crt` * `docker compose exec nextcloud chown www-data /tmp/root.crt` * `docker compose exec --user www-data nextcloud php occ security:certificates:import /tmp/root.crt` -3. Following [docs](https://docs.nextcloud.com/server/30/admin_manual/configuration_server/reverse_proxy_configuration.html#defining-trusted-proxies) configure Traefik as trusted proxy - * e.g. add `'trusted_proxies' => ['172.0.0.0/8'],` to `config/config.php` for a pretty broad allowance for most docker services (verify that your `gateway` network uses IPs in the given address range) +3. Configure Traefik as trusted proxy + * e.g. `docker compose exec --user www-data nextcloud php occ config:system:set trusted_proxies 2 --value=172.0.0.0/8` for a pretty broad allowance for most docker services (verify that your `gateway` network uses IPs in the given address range) 4. Download/Activate Nextcloud plugins: * `integration_openproject` * `groupfolders` (dependency for certain OP functions) diff --git a/docker/dev/nextcloud/docker-compose.yml b/docker/dev/nextcloud/docker-compose.yml index 9db2fa4ef1a..100a37dbc49 100644 --- a/docker/dev/nextcloud/docker-compose.yml +++ b/docker/dev/nextcloud/docker-compose.yml @@ -11,7 +11,7 @@ services: # - ../nextcloud_apps:/var/www/html/custom_apps labels: - "traefik.enable=true" - - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.local`)" + - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.nextcloud.entrypoints=websecure" cron: diff --git a/docker/dev/tls/.env b/docker/dev/tls/.env new file mode 100644 index 00000000000..c962deb2abe --- /dev/null +++ b/docker/dev/tls/.env @@ -0,0 +1 @@ +OPENPROJECT_DOCKER_DEV_TLD=local diff --git a/docker/dev/tls/docker-compose.core-override.example.yml b/docker/dev/tls/docker-compose.core-override.example.yml index 80850fe7921..d45a9be091b 100644 --- a/docker/dev/tls/docker-compose.core-override.example.yml +++ b/docker/dev/tls/docker-compose.core-override.example.yml @@ -6,41 +6,43 @@ x-op-env-override: &environment SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt # uncomment and set all the envs below to integrate keycloak with OpenProject # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_DISPLAY__NAME: Keycloak - # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST: keycloak.local - # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER: https://openproject.local + # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST: keycloak.${OPENPROJECT_DOCKER_DEV_TLD} + # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER: https://openproject.${OPENPROJECT_DOCKER_DEV_TLD} # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SECRET: - # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER: https://keycloak.local/realms/ + # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD}/realms/ # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_AUTHORIZATION__ENDPOINT: /realms//protocol/openid-connect/auth # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_TOKEN__ENDPOINT: /realms//protocol/openid-connect/token # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_USERINFO__ENDPOINT: /realms//protocol/openid-connect/userinfo - # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT: https://keycloak.local/realms//protocol/openid-connect/logout + # OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD}/realms//protocol/openid-connect/logout # uncomment the following for using minio (local S3) as file storage with TLS support: # OPENPROJECT_ATTACHMENTS__STORAGE: "fog" # OPENPROJECT_FOG_DIRECTORY: "openproject-uploads" # OPENPROJECT_FOG_CREDENTIALS_PROVIDER: "AWS" # Minio is S3 compliant, so we can use the AWS provider - # OPENPROJECT_FOG_CREDENTIALS_ENDPOINT: "https://minio.local" + # OPENPROJECT_FOG_CREDENTIALS_ENDPOINT: "https://minio.${OPENPROJECT_DOCKER_DEV_TLD}" # OPENPROJECT_FOG_CREDENTIALS_AWS__ACCESS__KEY__ID: "minioadmin" # OPENPROJECT_FOG_CREDENTIALS_AWS__SECRET__ACCESS__KEY: "minioadmin" # OPENPROJECT_FOG_CREDENTIALS_PATH__STYLE: "true" # OPENPROJECT_FOG_CREDENTIALS_REGION: "us-east-1" - # OPENPROJECT_DEV_EXTRA_HOSTS: "${OPENPROJECT_DEV_HOST},minio.local" + # OPENPROJECT_DEV_EXTRA_HOSTS: "${OPENPROJECT_DEV_HOST},minio.${OPENPROJECT_DOCKER_DEV_TLD}" services: backend: environment: <<: *environment - OPENPROJECT_CLI_PROXY: "https://openproject-assets.local" + OPENPROJECT_CLI_PROXY: "https://openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}" networks: - external volumes: - # Linux + # Debian/Arch - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro + # Fedora + - /etc/pki/tls/certs/ca-bundle.crt:/etc/ssl/certs/ca-certificates.crt:ro # Mac OS # - ~/.step/certs:/etc/ssl/certs # - ~/.step/certs:/usr/local/share/ca-certificates labels: - "traefik.enable=true" - - "traefik.http.routers.openproject.rule=Host(`openproject.local`)" + - "traefik.http.routers.openproject.rule=Host(`openproject.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.openproject.entrypoints=websecure" worker: @@ -49,8 +51,10 @@ services: networks: - external volumes: - # Linux + # Debian/Arch - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro + # Fedora + - /etc/pki/tls/certs/ca-bundle.crt:/etc/ssl/certs/ca-certificates.crt:ro # Mac OS # - ~/.step/certs:/etc/ssl/certs # - ~/.step/certs:/usr/local/share/ca-certificates @@ -60,8 +64,10 @@ services: networks: - external volumes: - # Linux + # Debian/Arch - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro + # Fedora + - /etc/pki/tls/certs/ca-bundle.crt:/etc/ssl/certs/ca-certificates.crt:ro # Mac OS # - ~/.step/certs:/etc/ssl/certs # - ~/.step/certs:/usr/local/share/ca-certificates @@ -71,7 +77,7 @@ services: - external labels: - "traefik.enable=true" - - "traefik.http.routers.openproject-assets.rule=Host(`openproject-assets.local`)" + - "traefik.http.routers.openproject-assets.rule=Host(`openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.openproject-assets.entrypoints=websecure" # You need to define the same external network diff --git a/docker/dev/tls/docker-compose.override.example.yml b/docker/dev/tls/docker-compose.override.example.yml index 37ab60bb7ed..f2f6b439f5f 100644 --- a/docker/dev/tls/docker-compose.override.example.yml +++ b/docker/dev/tls/docker-compose.override.example.yml @@ -1,17 +1,20 @@ services: traefik: - networks: - external: - aliases: - # Traefik is aliased to all the services that run behind it here. - # The reason to do this is that step-ca tries to validate the domains - # by connecting to them, and we'd like it to go through traefik, instead - # of calling the service containers directly. - - openproject.local - - openproject-assets.local - - nextcloud.local - - gitlab.local - - keycloak.local - - hocuspocus.local - - minio.local - - minioadmin.local + # Overwrite to enable Let's encrypt instead of using Step CA for certificate generation + # command: > + # --entryPoints.websecure.http.tls.certresolver=letsencrypt + # --certificatesresolvers.letsencrypt.acme.email=you@example.com + + # For step CA only: Overwrite trusted CA certificates with Step root CA (not needed for Let's encrypt) + environment: + - LEGO_CA_CERTIFICATES=/step/certs/root_ca.crt + + # Necessary for certificates via Step CA only + depends_on: + step: + condition: service_healthy + + # Enabling traefik for the traefik container itself will give you access to the Traefik Dashboard, which can be a useful + # tool to inspect whether everything is working fine. It's not advised to publicly expose this dashboard. + labels: + - "traefik.enable=true" diff --git a/docker/dev/tls/docker-compose.yml b/docker/dev/tls/docker-compose.yml index d9172f23f87..1d4542081c1 100644 --- a/docker/dev/tls/docker-compose.yml +++ b/docker/dev/tls/docker-compose.yml @@ -1,44 +1,29 @@ services: traefik: image: traefik:latest - command: > - --log.level=INFO - --providers.docker - --providers.docker.network=gateway - --providers.docker.exposedByDefault=false - --api.dashboard=true - --api.disabledashboardad=true - --entryPoints.web.address=:80 - --entryPoints.web.http.redirections.entrypoint.to=websecure - --entryPoints.websecure.address=:443 - --entryPoints.websecure.http.tls=true - --entryPoints.websecure.http.tls.certresolver=step - --certificatesresolvers.step.acme.caserver=https://step:9000/acme/acme/directory - --certificatesresolvers.step.acme.tlschallenge=true - --certificatesresolvers.step.acme.email=root@localhost - --certificatesresolvers.step.acme.keytype=RSA4096 - --certificatesresolvers.step.acme.storage=acme.json - environment: - - TZ=UTC - - LEGO_CA_CERTIFICATES=/step/certs/root_ca.crt ports: - "80:80" - "443:443" volumes: + - ./traefik.yaml:/etc/traefik/traefik.yaml:ro - /var/run/docker.sock:/var/run/docker.sock - ./acme.json:/acme.json - step:/step:ro restart: unless-stopped - depends_on: - step: - condition: service_healthy networks: external: aliases: - - traefik.local + - traefik.${OPENPROJECT_DOCKER_DEV_TLD} + - openproject.${OPENPROJECT_DOCKER_DEV_TLD} + - openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD} + - nextcloud.${OPENPROJECT_DOCKER_DEV_TLD} + - gitlab.${OPENPROJECT_DOCKER_DEV_TLD} + - keycloak.${OPENPROJECT_DOCKER_DEV_TLD} + - hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD} + - minio.${OPENPROJECT_DOCKER_DEV_TLD} + - minioadmin.${OPENPROJECT_DOCKER_DEV_TLD} labels: - - "traefik.enable=true" - - "traefik.http.routers.traefik.rule=Host(`traefik.local`)" + - "traefik.http.routers.traefik.rule=Host(`traefik.${OPENPROJECT_DOCKER_DEV_TLD}`)" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.routers.traefik.entrypoints=websecure" diff --git a/docker/dev/tls/traefik.yaml b/docker/dev/tls/traefik.yaml new file mode 100644 index 00000000000..7f19e16d581 --- /dev/null +++ b/docker/dev/tls/traefik.yaml @@ -0,0 +1,39 @@ +log: + level: INFO + +api: + dashboard: true + disabledashboardad: true + +providers: + docker: + network: gateway + exposedByDefault: false + +entryPoints: + web: + address: ":80" + http: + redirections: + entrypoint: + to: websecure + websecure: + address: ":443" + http: + tls: + certresolver: step # Using step by default, overwritable via CLI + +certificatesresolvers: + step: + acme: + caserver: https://step:9000/acme/acme/directory + tlschallenge: true + email: root@localhost + keytype: RSA4096 + storage: acme.json + letsencrypt: + acme: + keytype: RSA4096 + storage: acme.json + httpChallenge: + entryPoint: web diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 082b9e0f90f..1eb1daec3d8 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -113,7 +113,7 @@ ENV PGDATA=/var/openproject/pgdata COPY --from=openproject/gosu /go/bin/gosu /usr/local/bin/gosu RUN chmod +x /usr/local/bin/gosu && gosu nobody true -COPY --from=openproject/hocuspocus:17.0.3 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus +COPY --from=openproject/hocuspocus:17.1.0 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus RUN ./docker/prod/setup/postinstall-onprem.sh && \ ln -s /app/docker/prod/setup/.irbrc /root/ diff --git a/docker/prod/setup/preinstall-common.sh b/docker/prod/setup/preinstall-common.sh index 12824f8da63..77efda56922 100755 --- a/docker/prod/setup/preinstall-common.sh +++ b/docker/prod/setup/preinstall-common.sh @@ -64,14 +64,6 @@ done if [ ! "$BIM_SUPPORT" = "false" ]; then apt-get install -y wget unzip - # https://learn.microsoft.com/en-gb/dotnet/core/install/linux-debian#debian-12 - wget --no-verbose --tries 3 https://packages.microsoft.com/config/debian/12/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 @@ -88,7 +80,7 @@ if [ ! "$BIM_SUPPORT" = "false" ]; then unzip -q IfcConvert-v0.7.11-fea8e3a-linux64.zip mv IfcConvert "/usr/local/bin/IfcConvert" - wget --no-verbose --tries 3 https://github.com/bimspot/xeokit-metadata/releases/download/1.0.1/xeokit-metadata-linux-x64.tar.gz + wget --no-verbose --tries 3 https://github.com/opf/xeokit-metadata/releases/download/v1.1.0/xeokit-metadata-linux-x64.tar.gz tar -zxvf xeokit-metadata-linux-x64.tar.gz chmod +x xeokit-metadata-linux-x64/xeokit-metadata cp -r xeokit-metadata-linux-x64/ "/usr/lib/xeokit-metadata" diff --git a/docs/api/apiv3/components/examples/activity_response.yml b/docs/api/apiv3/components/examples/activity_response.yml index 414b2f6c1bf..1a0b9dc6c79 100644 --- a/docs/api/apiv3/components/examples/activity_response.yml +++ b/docs/api/apiv3/components/examples/activity_response.yml @@ -17,16 +17,16 @@ value: _type: Collection total: 1 count: 1 - _hint: Attachments resource shortened for brevity. + _abbreviated: Attachments resource shortened for brevity. workPackage: id: 207 _type: WorkPackage - _hint: Work package resource shortened for brevity. + _abbreviated: Work package resource shortened for brevity. emojiReactions: _type: Collection total: 1 count: 1 - _hint: Emoji reactions resource shortened for brevity. + _abbreviated: Emoji reactions resource shortened for brevity. _links: attachments: href: "/api/v3/activities/1478/attachments" diff --git a/docs/api/apiv3/components/examples/date_alert_notification.yml b/docs/api/apiv3/components/examples/date_alert_notification.yml index 900c8699cf6..642cc06bce6 100644 --- a/docs/api/apiv3/components/examples/date_alert_notification.yml +++ b/docs/api/apiv3/components/examples/date_alert_notification.yml @@ -9,12 +9,12 @@ value: updatedAt: '2022-04-06T09:03:24.347Z' _embedded: project: - _hint: Project resource shortened for brevity + _abbreviated: Project resource shortened for brevity _type: Project id: 11 name: Jedi Remnant Locator resource: - _hint: WorkPackage resource shortened for brevity + _abbreviated: WorkPackage resource shortened for brevity _type: WorkPackage id: 77 subject: Educate Visas Marr diff --git a/docs/api/apiv3/components/examples/grid-simple-collection-response.yml b/docs/api/apiv3/components/examples/grid-simple-collection-response.yml index e6224fef3a5..56d35c91b70 100644 --- a/docs/api/apiv3/components/examples/grid-simple-collection-response.yml +++ b/docs/api/apiv3/components/examples/grid-simple-collection-response.yml @@ -14,18 +14,21 @@ value: columnCount: 5 widgets: - _type: GridWidget + id: 1 identifier: time_entries_current_user startRow: 1 endRow: 8 startColumn: 1 endColumn: 3 - _type: GridWidget + id: 2 identifier: news startRow: 3 endRow: 8 startColumn: 4 endColumn: 5 - _type: GridWidget + id: 3 identifier: documents startRow: 1 endRow: 3 @@ -45,3 +48,12 @@ value: method: post self: href: "/api/v3/grids/2" + _links: + self: + href: "/api/v3/grids" + jumpTo: + href: '/api/v3/grids?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20' + templated: true + changeSize: + href: '/api/v3/grids?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D' + templated: true diff --git a/docs/api/apiv3/components/examples/grid-simple-response.yml b/docs/api/apiv3/components/examples/grid-simple-response.yml index 0ab74a4fa4e..01f004da0a4 100644 --- a/docs/api/apiv3/components/examples/grid-simple-response.yml +++ b/docs/api/apiv3/components/examples/grid-simple-response.yml @@ -7,18 +7,21 @@ value: columnCount: 5 widgets: - _type: GridWidget + id: 1 identifier: tasks startRow: 1 endRow: 8 startColumn: 1 endColumn: 3 - _type: GridWidget + id: 2 identifier: news startRow: 3 endRow: 8 startColumn: 4 endColumn: 5 - _type: GridWidget + id: 3 identifier: documents startRow: 1 endRow: 3 diff --git a/docs/api/apiv3/components/examples/hierarchy_item_collection_filtered_response.yml b/docs/api/apiv3/components/examples/hierarchy_item_collection_filtered_response.yml index f56cebe3018..6839b8041ca 100644 --- a/docs/api/apiv3/components/examples/hierarchy_item_collection_filtered_response.yml +++ b/docs/api/apiv3/components/examples/hierarchy_item_collection_filtered_response.yml @@ -10,6 +10,8 @@ value: id: 1338 label: Stormtroopers short: ST + weight: null + formattedWeight: null depth: 1 _links: self: @@ -18,6 +20,8 @@ value: parent: href: /api/v3/custom_field_items/1337 name: null + branch: + href: /api/v3/custom_field_items/1338/branch children: - href: /api/v3/custom_field_items/1340 name: ST-377 @@ -27,6 +31,8 @@ value: id: 1340 label: ST-377 short: null + weight: null + formattedWeight: null depth: 2 _links: self: @@ -35,6 +41,8 @@ value: parent: href: /api/v3/custom_field_items/1338 name: Stormtroopers + branch: + href: /api/v3/custom_field_items/1340/branch children: - href: /api/v3/custom_field_items/1480 name: ST-377-200 @@ -44,6 +52,8 @@ value: id: 1341 label: ST-422 short: null + weight: null + formattedWeight: null depth: 2 _links: self: @@ -52,6 +62,8 @@ value: parent: href: /api/v3/custom_field_items/1338 name: Stormtroopers + branch: + href: /api/v3/custom_field_items/1341/branch children: - href: /api/v3/custom_field_items/1580 name: ST-422-137 diff --git a/docs/api/apiv3/components/examples/hierarchy_item_collection_response.yml b/docs/api/apiv3/components/examples/hierarchy_item_collection_response.yml index 0fd692dd746..91bca8a6be4 100644 --- a/docs/api/apiv3/components/examples/hierarchy_item_collection_response.yml +++ b/docs/api/apiv3/components/examples/hierarchy_item_collection_response.yml @@ -10,13 +10,14 @@ value: id: 1337 label: null short: null + weight: null + formattedWeight: null depth: 0 _links: self: href: /api/v3/custom_field_items/1337 - name: null - parent: - href: null + branch: + href: /api/v3/custom_field_items/1337/branch children: - href: /api/v3/custom_field_items/1338 name: Stormtroopers @@ -26,6 +27,8 @@ value: id: 1338 label: Stormtroopers short: ST + weight: null + formattedWeight: null depth: 1 _links: self: @@ -33,19 +36,27 @@ value: name: Stormtroopers parent: href: /api/v3/custom_field_items/1337 - name: null + name: Imperial Troopers + branch: + href: /api/v3/custom_field_items/1338/branch children: - href: /api/v3/custom_field_items/1340 name: ST-377 - href: /api/v3/custom_field_items/1341 name: ST-422 - _type: HierarchyItem - _hint: hierarchy item shortened for brevity id: 1340 label: ST-377 short: null + weight: null + formattedWeight: null depth: 2 - - _hint: hierarchy item shortened for brevity + _links: + self: + href: /api/v3/custom_field_items/1340 + branch: + href: /api/v3/custom_field_items/1340/branch + children: [] _links: self: href: /api/v3/custom_field/42/items diff --git a/docs/api/apiv3/components/examples/hierarchy_item_response.yml b/docs/api/apiv3/components/examples/hierarchy_item_response.yml index 17568d048ca..3aa85c965e8 100644 --- a/docs/api/apiv3/components/examples/hierarchy_item_response.yml +++ b/docs/api/apiv3/components/examples/hierarchy_item_response.yml @@ -5,6 +5,8 @@ value: id: 1338 label: Stormtroopers short: ST + weight: null + formattedWeight: null depth: 1 _links: self: @@ -13,6 +15,8 @@ value: parent: href: /api/v3/custom_field_items/1337 name: null + branch: + href: /api/v3/custom_field_items/1338/branch children: - href: /api/v3/custom_field_items/1340 name: ST-377 diff --git a/docs/api/apiv3/components/examples/membership-form-response.yml b/docs/api/apiv3/components/examples/membership-form-response.yml index d14ed02a46f..78543f70f11 100644 --- a/docs/api/apiv3/components/examples/membership-form-response.yml +++ b/docs/api/apiv3/components/examples/membership-form-response.yml @@ -1,4 +1,4 @@ -description: |- +description: |- A simple form response example. value: _type: Form @@ -19,19 +19,19 @@ value: roles: [ ] schema: _type: Schema - _hint: Schema resource shortened for brevity + _abbreviated: Schema resource shortened for brevity validationErrors: roles: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation message: Roles need to be assigned. - _embedded: - details: + _embedded: + details: attribute: roles _links: - self: + self: href: '/api/v3/memberships/form' method: post - validate: + validate: href: '/api/v3/memberships/form' method: post diff --git a/docs/api/apiv3/components/examples/membership-simple-collection-response.yml b/docs/api/apiv3/components/examples/membership-simple-collection-response.yml index 01afaca7cf9..775e84f2372 100644 --- a/docs/api/apiv3/components/examples/membership-simple-collection-response.yml +++ b/docs/api/apiv3/components/examples/membership-simple-collection-response.yml @@ -2,8 +2,8 @@ description: |- A simple membership collection response example. value: _type: Collection - total: 2 - count: 2 + total: 1 + count: 1 pageSize: 20 offset: 1 _embedded: @@ -33,9 +33,6 @@ value: roles: - href: '/api/v3/roles/4' title: Sith Lord - - _type: Membership - id: 12 - _hint: Membership resource shortened for brevity _links: self: href: '/api/v3/memberships' diff --git a/docs/api/apiv3/components/examples/membership-simple-response.yml b/docs/api/apiv3/components/examples/membership-simple-response.yml index 28ff765c335..4dfd72ac7c3 100644 --- a/docs/api/apiv3/components/examples/membership-simple-response.yml +++ b/docs/api/apiv3/components/examples/membership-simple-response.yml @@ -9,15 +9,15 @@ value: project: _type: Project id: 3 - _hint: Project resource shortened for brevity + _abbreviated: Project resource shortened for brevity principal: _type: User id: 5 - _hint: User resource shortened for brevity + _abbreviated: User resource shortened for brevity roles: - _type: Role id: 4 - _hint: Roles resource shortened for brevity + _abbreviated: Roles resource shortened for brevity _links: self: href: '/api/v3/memberships/11' diff --git a/docs/api/apiv3/components/examples/mentioned_notification.yml b/docs/api/apiv3/components/examples/mentioned_notification.yml index a90e5c5a259..993207b8ca7 100644 --- a/docs/api/apiv3/components/examples/mentioned_notification.yml +++ b/docs/api/apiv3/components/examples/mentioned_notification.yml @@ -9,22 +9,22 @@ value: updatedAt: '2022-04-06T09:03:24.591Z' _embedded: author: - _hint: User resource shortened for brevity + _abbreviated: User resource shortened for brevity _type: User id: 13 name: Darth Nihilus project: - _hint: Project resource shortened for brevity + _abbreviated: Project resource shortened for brevity _type: Project id: 11 name: Jedi Remnant Locator activity: - _hint: Activity resource shortened for brevity + _abbreviated: Activity resource shortened for brevity _type: Activity::Comment id: 180 version: 3 resource: - _hint: WorkPackage resource shortened for brevity + _abbreviated: WorkPackage resource shortened for brevity _type: WorkPackage id: 77 subject: Educate Visas Marr diff --git a/docs/api/apiv3/components/examples/notification_collection.yml b/docs/api/apiv3/components/examples/notification_collection.yml index 88c05479c6c..5d8de6a3753 100644 --- a/docs/api/apiv3/components/examples/notification_collection.yml +++ b/docs/api/apiv3/components/examples/notification_collection.yml @@ -8,11 +8,11 @@ value: pageSize: 20 _embedded: elements: - - _hint: Notification resource shortened for brevity + - _abbreviated: Notification resource shortened for brevity id: 1 readIAN: false reason: mentioned - - _hint: Notification resource shortened for brevity + - _abbreviated: Notification resource shortened for brevity id: 2 readIAN: false reason: dateAlert diff --git a/docs/api/apiv3/components/examples/project_collection.yml b/docs/api/apiv3/components/examples/project_collection.yml index f6aba691786..3ad618dcb97 100644 --- a/docs/api/apiv3/components/examples/project_collection.yml +++ b/docs/api/apiv3/components/examples/project_collection.yml @@ -8,13 +8,13 @@ value: offset: 1 _embedded: elements: - - _hint: Project resource shortened for brevity + - _abbreviated: Project resource shortened for brevity id: 1 identifier: initialproject name: DeathStar construction active: true public: true - - _hint: Project resource shortened for brevity + - _abbreviated: Project resource shortened for brevity id: 2 identifier: mysecret name: Palpatine's secret plan diff --git a/docs/api/apiv3/components/examples/relation_collection_response.yml b/docs/api/apiv3/components/examples/relation_collection_response.yml index 2b780773791..98910767ec3 100644 --- a/docs/api/apiv3/components/examples/relation_collection_response.yml +++ b/docs/api/apiv3/components/examples/relation_collection_response.yml @@ -7,6 +7,7 @@ value: pageSize: 20 offset: 1 _embedded: + elements: - _type: Relation id: 650 name: duplicated by diff --git a/docs/api/apiv3/components/examples/relation_response.yml b/docs/api/apiv3/components/examples/relation_response.yml index 702a2b3bc5b..890190b933a 100644 --- a/docs/api/apiv3/components/examples/relation_response.yml +++ b/docs/api/apiv3/components/examples/relation_response.yml @@ -12,11 +12,11 @@ value: from: id: 108 _type: WorkPackage - _hint: Work package resource shortened for brevity. + _abbreviated: Work package resource shortened for brevity. to: id: 78 _type: WorkPackage - _hint: Work package resource shortened for brevity. + _abbreviated: Work package resource shortened for brevity. _links: self: href: /api/v3/relations/650 diff --git a/docs/api/apiv3/components/examples/storages-simple-collection-response.yml b/docs/api/apiv3/components/examples/storages-simple-collection-response.yml index e75d1456e41..7db35239116 100644 --- a/docs/api/apiv3/components/examples/storages-simple-collection-response.yml +++ b/docs/api/apiv3/components/examples/storages-simple-collection-response.yml @@ -63,3 +63,14 @@ value: href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1338"]}}] oauthClientCredentials: href: /api/v3/oauth_client_credentials/44 + _links: + self: + href: /api/v3/storages?filters=%5B%5D&offset=1&pageSize=20 + jumpTo: + href: /api/v3/storages?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20 + templated: true + changeSize: + href: /api/v3/storages?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D + templated: true + nextByOffset: + href: /api/v3/storages?filters=%5B%5D&offset=2&pageSize=20 diff --git a/docs/api/apiv3/components/examples/work_package_create_valid.yml b/docs/api/apiv3/components/examples/work_package_create_valid.yml index 0e251cf1853..10d961ca77d 100644 --- a/docs/api/apiv3/components/examples/work_package_create_valid.yml +++ b/docs/api/apiv3/components/examples/work_package_create_valid.yml @@ -2,15 +2,15 @@ description: |- A valid request body to create or edit a work package with a couple of properties. value: subject: Install Dromund Kass planetary shield - description: + description: format: markdown raw: |- # TODO - + The planetary shield of Dromund Kass needs to be installed to protect the planet from orbital bombardment. startDate: '2877-07-21' duration: P1337D - estimatedTime: P1Y5DT13H + estimatedTime: P370DT13H ignoreNonWorkingDays: true project: href: /api/v3/projects/42 diff --git a/docs/api/apiv3/components/examples/work_package_with_meta_validation.yml b/docs/api/apiv3/components/examples/work_package_with_meta_validation.yml index 621e6ec3418..6425547ecf2 100644 --- a/docs/api/apiv3/components/examples/work_package_with_meta_validation.yml +++ b/docs/api/apiv3/components/examples/work_package_with_meta_validation.yml @@ -2,5 +2,6 @@ description: |- A request body to edit a work package with custom field validation enabled via the _meta object. value: subject: Replace GNK power droids + lockVersion: 42 _meta: validateCustomFields: true diff --git a/docs/api/apiv3/components/schemas/activity_model.yml b/docs/api/apiv3/components/schemas/activity_model.yml index 1a2188fe418..aa3572783d2 100644 --- a/docs/api/apiv3/components/schemas/activity_model.yml +++ b/docs/api/apiv3/components/schemas/activity_model.yml @@ -224,6 +224,15 @@ example: project: href: "/api/v3/projects/918" title: "RVC Test" + schema: + href: "/api/v3/work_packages/schemas/11-2" + author: + href: "/api/v3/users/1" + title: OpenProject Admin - admin + priority: + href: "/api/v3/priorities/2" + title: Normal + ancestors: [] _links: self: href: "/api/v3/activity/1" diff --git a/docs/api/apiv3/components/schemas/attachment_model.yml b/docs/api/apiv3/components/schemas/attachment_model.yml index 0fe9be5dfa3..58a39f8cfde 100644 --- a/docs/api/apiv3/components/schemas/attachment_model.yml +++ b/docs/api/apiv3/components/schemas/attachment_model.yml @@ -2,9 +2,9 @@ --- type: object required: - - title - fileName - description + - status - contentType - digest - createdAt @@ -13,9 +13,6 @@ properties: type: integer description: Attachment's id minimum: 1 - title: - type: string - description: The name of the file fileName: type: string description: The name of the uploaded file @@ -27,12 +24,30 @@ properties: allOf: - $ref: "./formattable.yml" - description: A user provided description of the file + status: + type: string + enum: + - uploaded + - prepared + - scanned + - quarantined + - rescan contentType: type: string description: The files MIME-Type as determined by the server digest: - type: string + type: object description: A checksum for the files content + required: + - algorithm + - hash + properties: + algorithm: + type: string + description: "The algorithm used to generate the digest." + hash: + type: string + description: "The hexadecimal representation of the digested hash value." createdAt: type: string format: date-time @@ -98,6 +113,7 @@ example: id: 1 fileName: cat.png filesize: 24 + status: uploaded description: format: plain raw: A picture of a cute cat diff --git a/docs/api/apiv3/components/schemas/custom_action_model.yml b/docs/api/apiv3/components/schemas/custom_action_model.yml index 2df8091c89b..7bdd951b921 100644 --- a/docs/api/apiv3/components/schemas/custom_action_model.yml +++ b/docs/api/apiv3/components/schemas/custom_action_model.yml @@ -31,15 +31,15 @@ properties: - description: |- Execute this custom action. -examples: - - _type: CustomAction - name: Change project and type - description: Changes project and type in one go - _links: - executeImmediately: - href: "/api/v3/custom_actions/2/execute" - title: Execute Change project and type - method: post - self: - href: "/api/v3/custom_actions/2" - title: Change project and type +example: + _type: CustomAction + name: Change project and type + description: Changes project and type in one go + _links: + executeImmediately: + href: "/api/v3/custom_actions/2/execute" + title: Execute Change project and type + method: post + self: + href: "/api/v3/custom_actions/2" + title: Change project and type diff --git a/docs/api/apiv3/components/schemas/document_model.yml b/docs/api/apiv3/components/schemas/document_model.yml index 5dc4a49c369..96848ca3462 100644 --- a/docs/api/apiv3/components/schemas/document_model.yml +++ b/docs/api/apiv3/components/schemas/document_model.yml @@ -11,8 +11,9 @@ properties: type: string description: The title chosen for the document description: - type: string - description: A text describing the document + allOf: + - $ref: './formattable.yml' + - description: A text describing the document # content_binary: # type: string # description: The binary content of the document, base64 encoded diff --git a/docs/api/apiv3/components/schemas/file_link_collection_read_model.yml b/docs/api/apiv3/components/schemas/file_link_collection_read_model.yml index 4d0693eea18..d9d17c754cb 100644 --- a/docs/api/apiv3/components/schemas/file_link_collection_read_model.yml +++ b/docs/api/apiv3/components/schemas/file_link_collection_read_model.yml @@ -12,7 +12,7 @@ allOf: - $ref: './link.yml' - description: |- This file links collection - + **Resource**: FileLinkCollectionReadModel _embedded: type: object @@ -44,7 +44,7 @@ example: createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' originData: - id: 5503 + id: "5503" name: logo.png mimeType: image/png size: 16042 diff --git a/docs/api/apiv3/components/schemas/file_link_collection_write_model.yml b/docs/api/apiv3/components/schemas/file_link_collection_write_model.yml index a0a47eb27a2..6a514509374 100644 --- a/docs/api/apiv3/components/schemas/file_link_collection_write_model.yml +++ b/docs/api/apiv3/components/schemas/file_link_collection_write_model.yml @@ -1,26 +1,24 @@ # Schema: FileLinkCollectionWriteModel --- -allOf: - - $ref: './collection_model.yml' - - type: object +type: object +required: + - _embedded +properties: + _embedded: + type: object required: - - _embedded + - elements properties: - _embedded: - type: object - required: - - elements - properties: - elements: - type: array - items: - $ref: './file_link_write_model.yml' + elements: + type: array + items: + $ref: './file_link_write_model.yml' example: _embedded: elements: - originData: - id: 5503 + id: "5503" name: logo.png mimeType: image/png size: 16042 @@ -31,5 +29,3 @@ example: _links: storage: href: /api/v3/storage/42 - - _hint: File Link resource shortened for brevity - id: 1338 diff --git a/docs/api/apiv3/components/schemas/file_link_read_model.yml b/docs/api/apiv3/components/schemas/file_link_read_model.yml index 8c912c5a444..c6b0ed6dd75 100644 --- a/docs/api/apiv3/components/schemas/file_link_read_model.yml +++ b/docs/api/apiv3/components/schemas/file_link_read_model.yml @@ -27,8 +27,6 @@ properties: properties: storage: $ref: './storage_read_model.yml' - container: - $ref: './work_package_model.yml' _links: type: object properties: @@ -123,7 +121,7 @@ example: createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' originData: - id: 5503 + id: "5503" name: logo.png mimeType: image/png size: 16042 @@ -147,6 +145,10 @@ example: title: Nextcloud origin: href: https://nextcloud.deathstar.rocks/ + open: + href: https://example.com/a-link-to-open-the-file + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:Connected container: _hint: Work package resource shortened for brevity _type: WorkPackage diff --git a/docs/api/apiv3/components/schemas/file_link_write_model.yml b/docs/api/apiv3/components/schemas/file_link_write_model.yml index f596d148604..b1287b59a1a 100644 --- a/docs/api/apiv3/components/schemas/file_link_write_model.yml +++ b/docs/api/apiv3/components/schemas/file_link_write_model.yml @@ -18,7 +18,7 @@ properties: - $ref: './link.yml' - description: |- The storage resource of the linked file. - + **Resource**: Storage - type: object required: @@ -29,12 +29,12 @@ properties: - $ref: './link.yml' - description: |- The storage url the file link references to. - + **Resource**: N/A example: originData: - id: 5503 + id: "5503" name: logo.png mimeType: image/png size: 16042 diff --git a/docs/api/apiv3/components/schemas/group_collection_model.yml b/docs/api/apiv3/components/schemas/group_collection_model.yml index 7a9b17d4a13..b95aa99a44b 100644 --- a/docs/api/apiv3/components/schemas/group_collection_model.yml +++ b/docs/api/apiv3/components/schemas/group_collection_model.yml @@ -61,5 +61,5 @@ example: title: ST-097E - href: '/api/v3/users/60' title: ST-C-334 - - _hint: Group resource shortened for brevity + - _abbreviated: Group resource shortened for brevity id: 1338 diff --git a/docs/api/apiv3/components/schemas/help_text_collection_model.yml b/docs/api/apiv3/components/schemas/help_text_collection_model.yml index 024b41a8516..e12c5dcfb26 100644 --- a/docs/api/apiv3/components/schemas/help_text_collection_model.yml +++ b/docs/api/apiv3/components/schemas/help_text_collection_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: "./link.yml" - description: |- This help text collection - + **Resource**: HelpTextCollectionModel _embedded: type: object @@ -39,6 +39,14 @@ example: _links: self: href: "/api/v3/help_texts/1" + editText: + href: '/admin/attribute_help_texts/1/edit' + type: text/html + attachments: + href: '/api/v3/help_texts/1/attachments' + addAttachment: + href: '/api/v3/help_texts/1/attachments' + method: post id: 1 attribute: id attributeCaption: ID @@ -51,6 +59,14 @@ example: _links: self: href: "/api/v3/help_texts/2" + editText: + href: '/admin/attribute_help_texts/2/edit' + type: text/html + attachments: + href: '/api/v3/help_texts/2/attachments' + addAttachment: + href: '/api/v3/help_texts/2/attachments' + method: post id: 2 attribute: status attributeCaption: Status diff --git a/docs/api/apiv3/components/schemas/help_text_model.yml b/docs/api/apiv3/components/schemas/help_text_model.yml index bdefe88b7fe..90aefa7f7c0 100644 --- a/docs/api/apiv3/components/schemas/help_text_model.yml +++ b/docs/api/apiv3/components/schemas/help_text_model.yml @@ -80,6 +80,6 @@ example: type: text/html attachments: href: '/api/v3/help_texts/1/attachments' - addAttachments: + addAttachment: href: '/api/v3/help_texts/1/attachments' method: post diff --git a/docs/api/apiv3/components/schemas/hierarchy_item_read_model.yml b/docs/api/apiv3/components/schemas/hierarchy_item_read_model.yml index 6b427cddf87..beac07e7352 100644 --- a/docs/api/apiv3/components/schemas/hierarchy_item_read_model.yml +++ b/docs/api/apiv3/components/schemas/hierarchy_item_read_model.yml @@ -1,6 +1,15 @@ # Schema: HierarchyItemReadModel --- type: object +required: + - _type + - id + - label + - short + - weight + - formattedWeight + - depth + - _links properties: _type: type: string @@ -10,16 +19,43 @@ properties: type: integer description: Hierarchy item identifier label: - type: string + type: + - "string" + - "null" description: The label of the hierarchy item short: - type: string - description: The short name of the hierarchy item + type: + - string + - "null" + description: |- + The short name of the hierarchy item. If this attribute is set, the `weight` and + the `formattedWeight` are `null`. + weight: + type: + - string + - "null" + description: |- + The accurate weight of the hierarchy item. As a decimal precision number it is written as a string to + not loose precision with conversion to a floating point number. + If this attribute is set, the `short` is null. + formattedWeight: + type: + - string + - "null" + description: |- + The formatted weight of the hierarchy item. The standard formatting of the OpenProject server is used to + convert this number into a representable format - i.e. falling back to scientific notation for very small and + very big numbers. + If this attribute is set, the `short` is null. depth: type: integer description: The hierarchy depth. The root item has a depth of 0. _links: type: object + required: + - self + - children + - branch properties: self: allOf: @@ -42,5 +78,12 @@ properties: - $ref: './link.yml' - description: |- A hierarchy item that is a child of the current hierarchy item - + **Resource**: HierarchyItem + branch: + allOf: + - $ref: './link.yml' + - description: |- + The branch of the hierarchy item, ordered from root to node. + + **Resource**: HierarchyItemCollection diff --git a/docs/api/apiv3/components/schemas/news_create_model.yml b/docs/api/apiv3/components/schemas/news_create_model.yml index 582ddf486dd..4ed5dfbf429 100644 --- a/docs/api/apiv3/components/schemas/news_create_model.yml +++ b/docs/api/apiv3/components/schemas/news_create_model.yml @@ -31,6 +31,7 @@ example: summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus. Comparo crapula depopulo demonstro. description: + format: markdown raw: '**Videlicet deserunt aequitas cognatus**. Concedo quia est quia pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius. Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis eos velociter somniculosus diff --git a/docs/api/apiv3/components/schemas/news_model.yml b/docs/api/apiv3/components/schemas/news_model.yml index 3d7fd2db4ad..a041e77f47e 100644 --- a/docs/api/apiv3/components/schemas/news_model.yml +++ b/docs/api/apiv3/components/schemas/news_model.yml @@ -16,9 +16,10 @@ properties: description: A short summary readOnly: true description: - type: string - description: The main body of the news with all the details - readOnly: true + allOf: + - "$ref": "./formattable.yml" + - description: The main body of the news with all the details + readOnly: true createdAt: type: string format: date-time diff --git a/docs/api/apiv3/components/schemas/notification_model.yml b/docs/api/apiv3/components/schemas/notification_model.yml index c384bd1c3cd..b010c89069d 100644 --- a/docs/api/apiv3/components/schemas/notification_model.yml +++ b/docs/api/apiv3/components/schemas/notification_model.yml @@ -68,14 +68,13 @@ properties: - actor - activity - resource - - details properties: self: allOf: - "$ref": "./link.yml" - description: |- This notification - + **Resource**: Notification readIAN: allOf: @@ -92,7 +91,7 @@ properties: - "$ref": "./link.yml" - description: |- The workspace the notification originated in - + **Resource**: Workspace actor: allOf: @@ -100,7 +99,7 @@ properties: - description: |- The user that caused the notification. This might be null in case no user triggered the notification. - + **Resource**: User resource: allOf: @@ -117,13 +116,3 @@ properties: case no activity triggered the notification. **Resource**: Activity - details: - type: array - items: - allOf: - - "$ref": "./link.yml" - - description: |- - A list of objects including detailed information about the notification. The contents of - and type of this can vary widely between different notification reasons. - - **Resource**: Polymorphic (e.g. Values::Property) diff --git a/docs/api/apiv3/components/schemas/oauth_application_read_model.yml b/docs/api/apiv3/components/schemas/oauth_application_read_model.yml index bd63d469814..d79eea01fb4 100644 --- a/docs/api/apiv3/components/schemas/oauth_application_read_model.yml +++ b/docs/api/apiv3/components/schemas/oauth_application_read_model.yml @@ -7,7 +7,7 @@ required: - name - clientId - confidential - - _link + - _links properties: id: type: integer @@ -77,7 +77,7 @@ properties: - $ref: './link.yml' - description: |- A redirect URI of the OAuth application - + **Resource**: N/A example: diff --git a/docs/api/apiv3/components/schemas/oauth_client_credentials_read_model.yml b/docs/api/apiv3/components/schemas/oauth_client_credentials_read_model.yml index 023539420f6..17b5d627802 100644 --- a/docs/api/apiv3/components/schemas/oauth_client_credentials_read_model.yml +++ b/docs/api/apiv3/components/schemas/oauth_client_credentials_read_model.yml @@ -58,7 +58,7 @@ example: confidential: true createdAt: '2022-12-07T12:56:42.836Z' updatedAt: '2022-12-07T12:56:42.836Z' - _link: + _links: self: href: '/api/v3/oauth_client_credentials/1337' integration: diff --git a/docs/api/apiv3/components/schemas/placeholder_user_collection_model.yml b/docs/api/apiv3/components/schemas/placeholder_user_collection_model.yml index 36a2bf17768..f5c6d0e874e 100644 --- a/docs/api/apiv3/components/schemas/placeholder_user_collection_model.yml +++ b/docs/api/apiv3/components/schemas/placeholder_user_collection_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: "./link.yml" - description: |- This placeholder user collection - + **Resource**: Collection _embedded: type: object @@ -38,9 +38,9 @@ example: href: '/api/v3/placeholder_users' _embedded: elements: - - _hint: PlaceholderUser resource shortened for brevity + - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1337 - - _hint: PlaceholderUser resource shortened for brevity + - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1338 diff --git a/docs/api/apiv3/components/schemas/principal_collection_model.yml b/docs/api/apiv3/components/schemas/principal_collection_model.yml index 67bfc692612..8e8cdb14a8a 100644 --- a/docs/api/apiv3/components/schemas/principal_collection_model.yml +++ b/docs/api/apiv3/components/schemas/principal_collection_model.yml @@ -28,12 +28,12 @@ example: href: '/api/v3/principals' _embedded: elements: - - _hint: User resource shortened for brevity + - _abbreviated: User resource shortened for brevity _type: User id: 1337 - - _hint: Group resource shortened for brevity + - _abbreviated: Group resource shortened for brevity _type: Group id: 1338 - - _hint: PlaceholderUser resource shortened for brevity + - _abbreviated: PlaceholderUser resource shortened for brevity _type: PlaceholderUser id: 1339 diff --git a/docs/api/apiv3/components/schemas/project_configuration_model.yml b/docs/api/apiv3/components/schemas/project_configuration_model.yml new file mode 100644 index 00000000000..b9071e4491c --- /dev/null +++ b/docs/api/apiv3/components/schemas/project_configuration_model.yml @@ -0,0 +1,10 @@ +# Schema: ProjectConfigurationModel +--- +allOf: + - $ref: "./configuration_model.yml" + - type: object + properties: + enabledInternalComments: + type: boolean + description: Whether internal comments are enabled for this project + readOnly: true diff --git a/docs/api/apiv3/components/schemas/project_model.yml b/docs/api/apiv3/components/schemas/project_model.yml index 61a55915f75..f1553401a82 100644 --- a/docs/api/apiv3/components/schemas/project_model.yml +++ b/docs/api/apiv3/components/schemas/project_model.yml @@ -42,10 +42,6 @@ properties: required: - self - categories - - types - - versions - - memberships - - workPackages properties: update: allOf: diff --git a/docs/api/apiv3/components/schemas/project_phase_definition_collection_model.yml b/docs/api/apiv3/components/schemas/project_phase_definition_collection_model.yml index 9c7753a91dc..4568357f37d 100644 --- a/docs/api/apiv3/components/schemas/project_phase_definition_collection_model.yml +++ b/docs/api/apiv3/components/schemas/project_phase_definition_collection_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: "./link.yml" - description: |- This file links collection - + **Resource**: ProjectPhaseDefinitionCollectionModel _embedded: type: object @@ -40,8 +40,8 @@ example: - id: 14 name: "Initiating" _type: ProjectPhaseDefinition - _hint: project phase definition resource shortened for brevity + _abbreviated: project phase definition resource shortened for brevity - id: 15 name: "Executing" _type: ProjectPhaseDefinition - _hint: project phase definition resource shortened for brevity + _abbreviated: project phase definition resource shortened for brevity diff --git a/docs/api/apiv3/components/schemas/project_phase_definition_model.yml b/docs/api/apiv3/components/schemas/project_phase_definition_model.yml index cf185d0b3f7..ed34a3a6e26 100644 --- a/docs/api/apiv3/components/schemas/project_phase_definition_model.yml +++ b/docs/api/apiv3/components/schemas/project_phase_definition_model.yml @@ -6,7 +6,9 @@ required: - id - name - startGate + - startGateName - finishGate + - finishGateName - createdAt - updatedAt properties: @@ -23,11 +25,15 @@ properties: startGate: type: boolean startGateName: - type: string + type: + - "string" + - "null" finishGate: type: boolean finishGateName: - type: string + type: + - "string" + - "null" createdAt: type: string format: date-time @@ -51,7 +57,7 @@ properties: example: _type: 'ProjectPhaseDefinition' id: 1337 - title: 'Initiating' + name: 'Initiating' startGate: true startGateName: "Before Initiating" finishGate: true diff --git a/docs/api/apiv3/components/schemas/project_phase_model.yml b/docs/api/apiv3/components/schemas/project_phase_model.yml index 5bf396ba9df..a87f43f5420 100644 --- a/docs/api/apiv3/components/schemas/project_phase_model.yml +++ b/docs/api/apiv3/components/schemas/project_phase_model.yml @@ -60,7 +60,7 @@ properties: example: _type: 'ProjectPhase' id: 1337 - title: 'Initiating' + name: 'Initiating' active: true createdAt: '2023-01-20T14:30:00.368Z' updatedAt: '2023-05-23T11:57:48.618Z' diff --git a/docs/api/apiv3/components/schemas/project_storage_collection_model.yml b/docs/api/apiv3/components/schemas/project_storage_collection_model.yml index 093d42ca37c..ee2fce6c646 100644 --- a/docs/api/apiv3/components/schemas/project_storage_collection_model.yml +++ b/docs/api/apiv3/components/schemas/project_storage_collection_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: "./link.yml" - description: |- This file links collection - + **Resource**: ProjectStorageCollectionModel _embedded: type: object @@ -40,8 +40,8 @@ example: elements: - id: 1337 _type: ProjectStorage - _hint: project storage resource shortened for brevity + _abbreviated: project storage resource shortened for brevity - id: 1338 _type: ProjectStorage - _hint: File Link resource shortened for brevity + _abbreviated: File Link resource shortened for brevity diff --git a/docs/api/apiv3/components/schemas/query_filter_instance_model.yml b/docs/api/apiv3/components/schemas/query_filter_instance_model.yml new file mode 100644 index 00000000000..126f96d1a96 --- /dev/null +++ b/docs/api/apiv3/components/schemas/query_filter_instance_model.yml @@ -0,0 +1,22 @@ +type: object +required: + - _links + - _type + - name +properties: + _links: + type: object + required: + - filter + - schema + properties: + filter: + "$ref": "./link.yml" + schema: + "$ref": "./link.yml" + operator: + "$ref": "./link.yml" + _type: + type: string + name: + type: string diff --git a/docs/api/apiv3/components/schemas/query_filter_instance_schema_model.yml b/docs/api/apiv3/components/schemas/query_filter_instance_schema_model.yml index 69f5b9e3d5e..587492b0ed0 100644 --- a/docs/api/apiv3/components/schemas/query_filter_instance_schema_model.yml +++ b/docs/api/apiv3/components/schemas/query_filter_instance_schema_model.yml @@ -3,15 +3,12 @@ type: object required: - name -- filter +- _links properties: name: type: string description: Describes the name attribute readOnly: true - filter: - type: string - description: QuerySortBy name _links: type: object required: @@ -56,19 +53,7 @@ example: hasDefault: false writable: true _links: {} - name: - type: String - name: Name - required: true - hasDefault: true - writable: false - filter: - type: QueryFilter - name: Filter - required: true - hasDefault: false - writable: true - _links: {} + name: "A name" _links: self: href: "/api/v3/queries/filter_instance_schemas/author" diff --git a/docs/api/apiv3/components/schemas/query_model.yml b/docs/api/apiv3/components/schemas/query_model.yml index daf1fe37eb1..2c76911abd7 100644 --- a/docs/api/apiv3/components/schemas/query_model.yml +++ b/docs/api/apiv3/components/schemas/query_model.yml @@ -20,7 +20,7 @@ properties: to determine the resulting work packages readOnly: false items: - $ref: './query_filter_instance_schema_model.yml' + $ref: './query_filter_instance_model.yml' sums: type: boolean description: Should sums (of supported properties) be shown? diff --git a/docs/api/apiv3/components/schemas/status_model.yml b/docs/api/apiv3/components/schemas/status_model.yml index e17ae638423..63c6c3d3553 100644 --- a/docs/api/apiv3/components/schemas/status_model.yml +++ b/docs/api/apiv3/components/schemas/status_model.yml @@ -17,7 +17,9 @@ properties: type: boolean description: Indicates, whether work package of this status are considered closed color: - type: string + type: + - "string" + - "null" format: hex-code description: The color of the status isDefault: @@ -49,5 +51,5 @@ properties: - $ref: './link.yml' - description: |- This status - + **Resource**: Status diff --git a/docs/api/apiv3/components/schemas/storage_file_model.yml b/docs/api/apiv3/components/schemas/storage_file_model.yml index 71e07a4c279..21b6d822a4e 100644 --- a/docs/api/apiv3/components/schemas/storage_file_model.yml +++ b/docs/api/apiv3/components/schemas/storage_file_model.yml @@ -28,7 +28,7 @@ allOf: **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided example: - id: 42 + id: "42" name: readme.md _type: StorageFile location: '/readme.md' diff --git a/docs/api/apiv3/components/schemas/storage_files_model.yml b/docs/api/apiv3/components/schemas/storage_files_model.yml index 3da4da53d30..951aeeef69a 100644 --- a/docs/api/apiv3/components/schemas/storage_files_model.yml +++ b/docs/api/apiv3/components/schemas/storage_files_model.yml @@ -36,12 +36,12 @@ properties: - $ref: "./link.yml" - description: |- Not provided - + **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided example: _type: StorageFiles files: - - id: 42 + - id: "42" name: readme.md _type: StorageFile location: '/readme.md' @@ -54,7 +54,7 @@ example: _links: self: href: 'urn:openproject-org:api:v3:storages:storage_file:no_link_provided' - - id: 43 + - id: "43" name: readme.pdf _type: StorageFile location: '/readme.pdf' @@ -68,8 +68,9 @@ example: self: href: 'urn:openproject-org:api:v3:storages:storage_file:no_link_provided' parent: - id: 41 + id: "41" name: '/' + _type: StorageFile location: '/' mimeType: 'application/x-op-directory' size: 6144 @@ -84,4 +85,4 @@ example: _links: self: href: 'urn:openproject-org:api:v3:storages:storage_file:no_link_provided' - + diff --git a/docs/api/apiv3/components/schemas/storage_read_model.yml b/docs/api/apiv3/components/schemas/storage_read_model.yml index 4fbfed50382..f44bf5e7fec 100644 --- a/docs/api/apiv3/components/schemas/storage_read_model.yml +++ b/docs/api/apiv3/components/schemas/storage_read_model.yml @@ -33,17 +33,21 @@ properties: This is only required for authentication through single-sign-on and so far only supported for provider type Nextcloud. tenantId: - type: string + type: + - "string" + - "null" description: |- The tenant id of a file storage of type OneDrive. - Ignored if the provider type is not OneDrive. + Ignored if the provider type is not OneDrive. May be null if the storage is not configured completely. driveId: - type: string + type: + - "string" + - "null" description: |- The drive id of a file storage of type OneDrive. - Ignored if the provider type is not OneDrive. + Ignored if the provider type is not OneDrive. May be null if the storage is not configured completely. hasApplicationPassword: type: boolean description: |- diff --git a/docs/api/apiv3/components/schemas/time_entry_activity_model.yml b/docs/api/apiv3/components/schemas/time_entry_activity_model.yml index 40ac29803bd..04962e56902 100644 --- a/docs/api/apiv3/components/schemas/time_entry_activity_model.yml +++ b/docs/api/apiv3/components/schemas/time_entry_activity_model.yml @@ -50,7 +50,7 @@ properties: - $ref: './link.yml' - description: |- This time entry activity - + **Resource**: TimeEntriesActivity projects: type: array @@ -59,23 +59,23 @@ properties: - $ref: './link.yml' - description: |- One of the projects the time entry is active in. - + **Resource**: Project -examples: - - _type: TimeEntriesActivity - id: 18 - name: Management - position: 8 - default: false - _embedded: - projects: [ ] - _links: - self: - href: "/api/v3/time_entries/activities/18" - title: Management - projects: - - href: "/api/v3/projects/death_star_v2" - title: DeathStarV2 - - href: "/api/v3/projects/star_killer_base" - title: StarKillerBase +example: + _type: TimeEntriesActivity + id: 18 + name: Management + position: 8 + default: false + _embedded: + projects: [ ] + _links: + self: + href: "/api/v3/time_entries/activities/18" + title: Management + projects: + - href: "/api/v3/projects/death_star_v2" + title: DeathStarV2 + - href: "/api/v3/projects/star_killer_base" + title: StarKillerBase diff --git a/docs/api/apiv3/components/schemas/time_entry_collection_model.yml b/docs/api/apiv3/components/schemas/time_entry_collection_model.yml index 66f15d4c53d..f2520f3464a 100644 --- a/docs/api/apiv3/components/schemas/time_entry_collection_model.yml +++ b/docs/api/apiv3/components/schemas/time_entry_collection_model.yml @@ -30,88 +30,88 @@ allOf: items: $ref: "./time_entry_model.yml" -examples: - - _type: Collection - total: 39 - count: 2 - pageSize: 2 - offset: 1 - _embedded: - elements: - - _type: TimeEntry - id: 5 - comment: - format: plain - raw: Some comment - html: "

    Some comment

    " - spentOn: "2015-03-20" - hours: PT5H - startTime: "2015-03-20T10:00:00.000Z" - endTime: "2015-03-20T15:00:00.000Z" - createdAt: "2015-03-20T12:56:56.803Z" - updatedAt: "2015-03-20T12:56:56.803Z" - _links: - self: - href: "/api/v3/time_entries/1" - updateImmediately: - href: "/api/v3/time_entries/1" - method: patch - delete: - href: "/api/v3/time_entries/1" - method: delete - project: - href: "/api/v3/projects/1" - title: Some project - entity: - href: "/api/v3/work_packages/1" - title: Some work package - user: - href: "/api/v3/users/2" - title: Some user - activity: - href: "/api/v3/time_entries/activities/18" - title: Some time entry activity - - _type: TimeEntry - id: 10 - comment: - format: plain - raw: Another comment - html: "

    Another comment

    " - spentOn: "2015-03-21" - hours: PT7H - startTime: "2015-03-20T15:00:00.000Z" - endTime: "2015-03-20T22:00:00.000Z" - createdAt: "2015-03-20T12:56:56.569Z" - updatedAt: "2015-03-20T12:56:56.371Z" - _links: - self: - href: "/api/v3/time_entries/2" - project: - href: "/api/v3/projects/42" - title: Some other project - entity: - href: "/api/v3/work_packages/541" - title: Some other work package - user: - href: "/api/v3/users/6" - title: Some other project - activity: - href: "/api/v3/time_entries/activities/14" - title: some other time entry activity - _links: - self: - href: "/api/v3/time_entries?offset=1&pageSize=2" - jumpTo: - href: "/api/v3/time_entries?offset=%7Boffset%7D&pageSize=2" - templated: true - changeSize: - href: "/api/v3/time_entries?offset=1&pageSize=%7Bsize%7D" - templated: true - nextByOffset: - href: "/api/v3/time_entries?offset=2&pageSize=2" - createTimeEntry: - href: "/api/v3/time_entries/form" - method: post - createTimeEntryImmediately: - href: "/api/v3/time_entries" - method: post +example: + _type: Collection + total: 39 + count: 2 + pageSize: 2 + offset: 1 + _embedded: + elements: + - _type: TimeEntry + id: 5 + comment: + format: plain + raw: Some comment + html: "

    Some comment

    " + spentOn: "2015-03-20" + hours: PT5H + startTime: "2015-03-20T10:00:00.000Z" + endTime: "2015-03-20T15:00:00.000Z" + createdAt: "2015-03-20T12:56:56.803Z" + updatedAt: "2015-03-20T12:56:56.803Z" + _links: + self: + href: "/api/v3/time_entries/1" + updateImmediately: + href: "/api/v3/time_entries/1" + method: patch + delete: + href: "/api/v3/time_entries/1" + method: delete + project: + href: "/api/v3/projects/1" + title: Some project + entity: + href: "/api/v3/work_packages/1" + title: Some work package + user: + href: "/api/v3/users/2" + title: Some user + activity: + href: "/api/v3/time_entries/activities/18" + title: Some time entry activity + - _type: TimeEntry + id: 10 + comment: + format: plain + raw: Another comment + html: "

    Another comment

    " + spentOn: "2015-03-21" + hours: PT7H + startTime: "2015-03-20T15:00:00.000Z" + endTime: "2015-03-20T22:00:00.000Z" + createdAt: "2015-03-20T12:56:56.569Z" + updatedAt: "2015-03-20T12:56:56.371Z" + _links: + self: + href: "/api/v3/time_entries/2" + project: + href: "/api/v3/projects/42" + title: Some other project + entity: + href: "/api/v3/work_packages/541" + title: Some other work package + user: + href: "/api/v3/users/6" + title: Some other project + activity: + href: "/api/v3/time_entries/activities/14" + title: some other time entry activity + _links: + self: + href: "/api/v3/time_entries?offset=1&pageSize=2" + jumpTo: + href: "/api/v3/time_entries?offset=%7Boffset%7D&pageSize=2" + templated: true + changeSize: + href: "/api/v3/time_entries?offset=1&pageSize=%7Bsize%7D" + templated: true + nextByOffset: + href: "/api/v3/time_entries?offset=2&pageSize=2" + createTimeEntry: + href: "/api/v3/time_entries/form" + method: post + createTimeEntryImmediately: + href: "/api/v3/time_entries" + method: post diff --git a/docs/api/apiv3/components/schemas/time_entry_model.yml b/docs/api/apiv3/components/schemas/time_entry_model.yml index 1fe43546dd6..502a25f454b 100644 --- a/docs/api/apiv3/components/schemas/time_entry_model.yml +++ b/docs/api/apiv3/components/schemas/time_entry_model.yml @@ -7,8 +7,9 @@ properties: description: The id of the time entry minimum: 1 comment: - type: string - description: A comment to the time entry + allOf: + - $ref: './formattable.yml' + - description: A comment to the time entry spentOn: type: string format: date @@ -129,42 +130,42 @@ properties: **Resource**: TimeEntriesActivity -examples: - - _type: TimeEntry - id: 42 - comment: - format: plain - raw: "The force shall set me free." - html: "

    The force shall set me free.

    " - spentOn: "2023-01-11" - hours: "PT4H" - startTime: "2023-01-11T09:58:00.000Z" - endTime: "2023-01-11T13:58:00.000Z" - createdAt: "2023-01-11T13:58:24.927Z" - updatedAt: "2023-01-11T13:58:24.927Z" - _links: - self: - href: "/api/v3/time_entries/42" - updateImmediately: - href: "/api/v3/time_entries/42" - method: patch - update: - href: "/api/v3/time_entries/42/form" - method: post - delete: - href: "/api/v3/time_entries/42" - method: delete - schema: - href: "/api/v3/time_entries/schema" - project: - href: "/api/v3/projects/11" - title: DeathStarV2 - entity: - href: "/api/v3/work_packages/77" - title: Build new hangar - user: - href: "/api/v3/users/3" - title: Darth Vader - activity: - href: "/api/v3/time_entries/activities/1" - title: Management +example: + _type: TimeEntry + id: 42 + comment: + format: plain + raw: "The force shall set me free." + html: "

    The force shall set me free.

    " + spentOn: "2023-01-11" + hours: "PT4H" + startTime: "2023-01-11T09:58:00.000Z" + endTime: "2023-01-11T13:58:00.000Z" + createdAt: "2023-01-11T13:58:24.927Z" + updatedAt: "2023-01-11T13:58:24.927Z" + _links: + self: + href: "/api/v3/time_entries/42" + updateImmediately: + href: "/api/v3/time_entries/42" + method: patch + update: + href: "/api/v3/time_entries/42/form" + method: post + delete: + href: "/api/v3/time_entries/42" + method: delete + schema: + href: "/api/v3/time_entries/schema" + project: + href: "/api/v3/projects/11" + title: DeathStarV2 + entity: + href: "/api/v3/work_packages/77" + title: Build new hangar + user: + href: "/api/v3/users/3" + title: Darth Vader + activity: + href: "/api/v3/time_entries/activities/1" + title: Management diff --git a/docs/api/apiv3/components/schemas/type_model.yml b/docs/api/apiv3/components/schemas/type_model.yml index 8426c2686a5..80061869768 100644 --- a/docs/api/apiv3/components/schemas/type_model.yml +++ b/docs/api/apiv3/components/schemas/type_model.yml @@ -1,6 +1,15 @@ # Schema: TypeModel --- type: object +required: +- id +- name +- color +- position +- isDefault +- isMilestone +- createdAt +- updatedAt properties: id: type: integer @@ -12,7 +21,9 @@ properties: description: Type name readOnly: true color: - type: string + type: + - "string" + - "null" description: The color used to represent this type readOnly: true position: diff --git a/docs/api/apiv3/components/schemas/user_collection_model.yml b/docs/api/apiv3/components/schemas/user_collection_model.yml index f803db5f7ac..7c22cb34966 100644 --- a/docs/api/apiv3/components/schemas/user_collection_model.yml +++ b/docs/api/apiv3/components/schemas/user_collection_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: './link.yml' - description: |- This user collection - + **Resource**: Collection _embedded: type: object @@ -38,9 +38,9 @@ example: href: '/api/v3/users' _embedded: elements: - - _hint: User resource shortened for brevity + - _abbreviated: User resource shortened for brevity _type: User id: 1337 - - _hint: User resource shortened for brevity + - _abbreviated: User resource shortened for brevity _type: User id: 1338 diff --git a/docs/api/apiv3/components/schemas/user_model.yml b/docs/api/apiv3/components/schemas/user_model.yml index b5a8286ca84..99fe2cefac2 100644 --- a/docs/api/apiv3/components/schemas/user_model.yml +++ b/docs/api/apiv3/components/schemas/user_model.yml @@ -12,43 +12,45 @@ allOf: enum: - User avatar: - type: string + type: + - "string" + - "null" format: uri description: URL to user's avatar login: type: string description: |- The user's login name - + # Conditions - + - User is self, or `create_user` or `manage_user` permission globally maxLength: 256 firstName: type: string description: |- The user's first name - + # Conditions - + - User is self, or `create_user` or `manage_user` permission globally maxLength: 30 lastName: type: string description: |- The user's last name - + # Conditions - + - User is self, or `create_user` or `manage_user` permission globally maxLength: 30 email: type: string description: |- The user's email address - + # Conditions - + - E-Mail address not hidden - User is not a new record - User is self, or `create_user` or `manage_user` permission globally @@ -57,15 +59,15 @@ allOf: type: boolean description: |- Flag indicating whether or not the user is an admin - + # Conditions - + - `admin` status: type: string description: |- The current activation status of the user. - + # Conditions - User is self, or `create_user` or `manage_user` permission globally @@ -73,9 +75,9 @@ allOf: type: string description: |- User's language | ISO 639-1 format - + # Conditions - + - User is self, or `create_user` or `manage_user` permission globally identityUrl: type: @@ -84,9 +86,9 @@ allOf: description: |- User's identity_url for OmniAuth authentication. **Deprecated:** It will be removed in the near future. - + # Conditions - + - User is self, or `create_user` or `manage_user` permission globally deprecated: true createdAt: @@ -115,18 +117,18 @@ allOf: - $ref: './link.yml' - description: |- A link to update the user resource. - + # Conditions - + - `admin` lock: allOf: - $ref: './link.yml' - description: |- Restrict the user from logging in and performing any actions. - + # Conditions - + - User is not locked - `admin` unlock: @@ -134,9 +136,9 @@ allOf: - $ref: './link.yml' - description: |- Allow a locked user to login and act again. - + # Conditions - + - User is not locked - `admin` delete: @@ -144,9 +146,9 @@ allOf: - $ref: './link.yml' - description: |- Permanently remove a user from the instance - + # Conditions - + either: - `admin` - Setting `users_deletable_by_admin` is set @@ -158,8 +160,8 @@ allOf: - $ref: './link.yml' - description: |- Permanently remove a user from the instance - + # Conditions - + - LDAP authentication configured - `admin` diff --git a/docs/api/apiv3/components/schemas/version_model.yml b/docs/api/apiv3/components/schemas/version_model.yml index cc1170c352c..2e2c7b3e8fb 100644 --- a/docs/api/apiv3/components/schemas/version_model.yml +++ b/docs/api/apiv3/components/schemas/version_model.yml @@ -21,10 +21,14 @@ properties: - "$ref": "./formattable.yml" - {} startDate: - type: string + type: + - "string" + - "null" format: date endDate: - type: string + type: + - "string" + - "null" format: date status: type: string @@ -117,7 +121,9 @@ example: raw: This version has a description html: This version has a description startDate: '2014-11-20' - endDate: + endDate: status: open sharing: system customField14: '1234567890' + createdAt: "2025-12-10T13:37:00Z" + updatedAt: "2025-12-10T13:37:00Z" diff --git a/docs/api/apiv3/components/schemas/watchers_model.yml b/docs/api/apiv3/components/schemas/watchers_model.yml index 018ec588e1d..dc15a92bde7 100644 --- a/docs/api/apiv3/components/schemas/watchers_model.yml +++ b/docs/api/apiv3/components/schemas/watchers_model.yml @@ -59,6 +59,7 @@ example: login: j.sheppard firstName: John lastName: Sheppard + name: John Sheppard mail: shep@mail.com avatar: https://example.org/users/1/avatar status: active @@ -81,6 +82,7 @@ example: login: j.sheppard2 firstName: Jim lastName: Sheppard + name: Jim Sheppard mail: shep@mail.net avatar: https://example.org/users/1/avatar status: active diff --git a/docs/api/apiv3/components/schemas/work_package_model.yml b/docs/api/apiv3/components/schemas/work_package_model.yml index 9ca362a0c02..f0cf0da72a2 100644 --- a/docs/api/apiv3/components/schemas/work_package_model.yml +++ b/docs/api/apiv3/components/schemas/work_package_model.yml @@ -36,44 +36,60 @@ properties: type: boolean description: If true, the work package is in a readonly status so with the exception of the status, no other property can be altered. startDate: - type: string + type: + - "string" + - "null" format: date description: Scheduled beginning of a work package dueDate: - type: string + type: + - "string" + - "null" format: date description: Scheduled end of a work package date: - type: string + type: + - "string" + - "null" format: date description: Date on which a milestone is achieved derivedStartDate: - type: string + type: + - "string" + - "null" format: date description: Similar to start date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. readOnly: true derivedDueDate: - type: string + type: + - "string" + - "null" format: date description: Similar to due date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate. readOnly: true duration: - type: string + type: + - "string" + - "null" format: duration description: |- **(NOT IMPLEMENTED)** The amount of time in hours the work package needs to be completed. Not available for milestone type of work packages. readOnly: true estimatedTime: - type: string + type: + - "string" + - "null" format: duration description: Time a work package likely needs to be completed excluding its descendants derivedEstimatedTime: - type: string + type: + - "string" + - "null" format: duration description: Time a work package likely needs to be completed including its descendants readOnly: true @@ -94,12 +110,16 @@ properties: **Permission** view time entries readOnly: true percentageDone: - type: integer + type: + - "integer" + - "null" description: Amount of total completion for a work package minimum: 0 maximum: 100 derivedPercentageDone: - type: integer + type: + - "integer" + - "null" description: Amount of total completion for a work package derived from itself and its descendant work packages readOnly: true minimum: 0 @@ -120,9 +140,7 @@ properties: - self - schema - ancestors - - attachments - author - - children - priority - project - status diff --git a/docs/api/apiv3/components/schemas/work_packages_model.yml b/docs/api/apiv3/components/schemas/work_packages_model.yml index b1a86d5a2de..75690cc7701 100644 --- a/docs/api/apiv3/components/schemas/work_packages_model.yml +++ b/docs/api/apiv3/components/schemas/work_packages_model.yml @@ -17,7 +17,7 @@ allOf: - $ref: './link.yml' - description: |- The work package collection - + **Resource**: WorkPackageCollection readOnly: true _embedded: @@ -39,13 +39,13 @@ example: _type: Collection _embedded: elements: - - _hint: Work package resource shortened for brevity + - _abbreviated: Work package resource shortened for brevity _type: WorkPackage _links: self: href: '/api/v3/work_packages/1' id: 1 - - _hint: Work package resource shortened for brevity + - _abbreviated: Work package resource shortened for brevity _type: WorkPackage _links: self: diff --git a/docs/api/apiv3/components/schemas/workspaces_schema_model.yml b/docs/api/apiv3/components/schemas/workspaces_schema_model.yml index 0bce747d483..362ed732de7 100644 --- a/docs/api/apiv3/components/schemas/workspaces_schema_model.yml +++ b/docs/api/apiv3/components/schemas/workspaces_schema_model.yml @@ -101,14 +101,14 @@ example: - _type: ProjectFormCustomFieldSection name: Project Details attributes: - customField30 - customField34 + - customField30 + - customField34 - _type: ProjectFormCustomFieldSection name: Budget Information attributes: - customField31 - customField32 - customField35 + - customField31 + - customField32 + - customField35 id: type: Integer name: ID diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index 30f04518905..4c92879d312 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -364,6 +364,8 @@ paths: "$ref": "./paths/project_versions.yml" "/api/v3/projects/{id}/favorite": "$ref": "./paths/project_favorite.yml" + "/api/v3/projects/{id}/configuration": + "$ref": "./paths/project_configuration.yml" "/api/v3/queries": "$ref": "./paths/queries.yml" "/api/v3/queries/available_projects": @@ -717,6 +719,8 @@ components: "$ref": "./components/schemas/collection_model.yml" ConfigurationModel: "$ref": "./components/schemas/configuration_model.yml" + ProjectConfigurationModel: + "$ref": "./components/schemas/project_configuration_model.yml" CustomActionModel: "$ref": "./components/schemas/custom_action_model.yml" CustomOptionModel: @@ -879,6 +883,8 @@ components: "$ref": "./components/schemas/query_create_form.yml" Query_FilterModel: "$ref": "./components/schemas/query_filter_model.yml" + Query_Filter_Instance_Model: + "$ref": "./components/schemas/query_filter_instance_model.yml" Query_Filter_Instance_SchemaModel: "$ref": "./components/schemas/query_filter_instance_schema_model.yml" Query_Filter_Instance_SchemasModel: diff --git a/docs/api/apiv3/paths/project_configuration.yml b/docs/api/apiv3/paths/project_configuration.yml new file mode 100644 index 00000000000..595bd99bdd5 --- /dev/null +++ b/docs/api/apiv3/paths/project_configuration.yml @@ -0,0 +1,54 @@ +# /api/v3/projects/{id}/configuration +--- +get: + parameters: + - description: Project id + example: '1' + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + content: + application/hal+json: + examples: + response: + value: + _type: Configuration + _links: + self: + href: "/api/v3/projects/1/configuration" + userPreferences: + href: "/api/v3/my_preferences" + maximumAttachmentFileSize: 5242880 + perPageOptions: + - 20 + - 100 + enabledInternalComments: true + schema: + "$ref": "../components/schemas/project_configuration_model.yml" + description: OK + headers: {} + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: Returned if the project does not exist or the user cannot view it. + headers: {} + tags: + - Configuration + - Projects + description: |- + Returns the configuration scoped to a specific project, including all global + configuration properties plus project-specific settings. + operationId: View_project_configuration + summary: View project configuration diff --git a/docs/development/development-environment/docker/README.md b/docs/development/development-environment/docker/README.md index d16ff6a5803..18b9d22921b 100644 --- a/docs/development/development-environment/docker/README.md +++ b/docs/development/development-environment/docker/README.md @@ -264,13 +264,6 @@ define for your services to your `/etc/hosts`. ::1 openproject.local openproject-assets.local traefik.local ``` -#### DNS? Where are you? - -We have plans to add a local DNS to this development setup, making two things possible: - -1. No requirement to amend your `/etc/hosts` file anymore. -2. Being accessible from another device within your internal network (e.g. a cellphone). - ### Local certificate authority We use [traefik](https://traefik.io/) as a reverse proxy and [step-ca](https://smallstep.com/docs/step-ca/) as a local @@ -347,6 +340,28 @@ update-ca-certificates After that the generated root CA should be inside `/etc/ssl/certs/ca-certificates.crt`. +#### Fedora + +On Fedora, you need to add the root CA to the trusted system authorities. + +```shell +# Copy root certificate to any temporary location +docker compose --project-directory docker/dev/tls cp step:/home/step/certs/root_ca.crt $HOME/tmp/root_ca.crt +sudo cp $HOME/tmp/root_ca.crt /etc/pki/ca-trust/source/anchors/OpenProject_Development_Root_CA.crt +sudo update-ca-trust +``` + +#### Arch + +On ArchLinux, you need to install the root CA into the trusted system authorities. + +```shell +# Copy root certificate to any temporary location +docker compose --project-directory docker/dev/tls cp step:/home/step/certs/root_ca.crt $HOME/tmp/root_ca.crt +sudo install -Dm644 $HOME/tmp/root_ca.crt /etc/ca-certificates/trust-source/anchors/OpenProject_Development_Root_CA.crt +sudo update-ca-trust +``` + #### NixOS On NixOS, you need to add the generated root CA to system certificates bundle. To do so, you need to persist the @@ -435,6 +450,23 @@ to have Nextcloud running to test the Nextcloud-OpenProject integration. To do t 2. Make sure step-ca can reach it to validate it for SSH. In `docker/dev/tls/docker-compose.override.yml`, add the host to the `aliases` section of the traefik networking. +### Alternative: Using Let's encrypt + +An alternative approach is to issue certificates through Let's encrypt. This allows you to skip steps related to usage and setup +of a custom, non-trusted CA. However, it requires that you have access to a domain name that you control and requires additional +step to make the reverse proxy publicly reachable, which is not in scope of what this documentation can cover. + +If you need such a setup, you can change the `docker-compose.override.yml` for the reverse proxy, to use `letsencrypt` (see the +corresponding `docker-compose.override.example.yml`). Make sure to export an environment variable with your alternative DNS zone +before starting anything via docker compose. For example: + +```bash +export OPENPROJECT_DOCKER_DEV_TLD=dev.example.com +docker compose up -d backend frontend +``` + +Will make your containers available under openproject.dev.example.com and openproject-assets.dev.example.com respectively. + ### Troubleshooting After this setup you should be able to access your OpenProject development instance at `https://openproject.local`. If @@ -542,7 +574,7 @@ Upon setting up all the things correctly, we can see a login with `keycloak` opt ## MinIO Service (local S3 storage backend) -Within `docker/dev/minio` a compose file is provided for running a local MinIO instance with TLS support which can be used as a S3 storage for uploading files. +Within `docker/dev/minio` a compose file is provided for running a local MinIO instance with TLS support which can be used as a S3 storage for uploading files. When running with TLS support, the MinIO instance will be accessible on `https://minio.local` and a management UI (MinIO Console) will be available on `https://minioadmin.local/`. ### Running the MinIO Instance @@ -556,8 +588,8 @@ docker compose --project-directory docker/dev/minio up -d ``` This will automatically create a bucket named `openproject-uploads` which is used to store uploaded files. -If you want to use TLS support, make sure to copy and uncomment the MinIO configuration environment variables in `docker/dev/tls/docker-compose.core.override.example.yml` to your `docker-compose.override.yml` file in the project root directory. If you want to use MinIO without TLS support, make sure to copy the environment variables from `docker/dev/minio/docker-compose.core-override.example.yml` to your `docker-compose.override.yml` file (in the project root directory). -After that, hard restart the `backend` service to apply the changes: +If you want to use TLS support, make sure to copy and uncomment the MinIO configuration environment variables in `docker/dev/tls/docker-compose.core.override.example.yml` to your `docker-compose.override.yml` file in the project root directory. If you want to use MinIO without TLS support, make sure to copy the environment variables from `docker/dev/minio/docker-compose.core-override.example.yml` to your `docker-compose.override.yml` file (in the project root directory). +After that, hard restart the `backend` service to apply the changes: ``` docker compose down backend diff --git a/docs/enterprise-guide/README.md b/docs/enterprise-guide/README.md index a2590f4e395..d74a69d1b69 100644 --- a/docs/enterprise-guide/README.md +++ b/docs/enterprise-guide/README.md @@ -36,7 +36,7 @@ The following changes to our Enterprise plans will become effective on 2025-05-2 | Community | Basic | Professional | Premium | Corporate | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| **All [Community features](https://www.openproject.org/pricing/#features)** | **All Community features +**
    **Basic Enterprise add-ons**:
    - Baseline comparisons
    - Status boards (Kanban)
    - Assignee boards
    - Version boards
    - Subproject boards
    - Parent-child boards (Work Breakdown Structure)
    - Attribute highlighting
    - Intelligent workflows with custom action buttons
    - Custom fields of type hierarchy
    - Date alerts
    - Custom theme and logo
    - Configure work package forms
    - Gantt charts PDF export
    - Graphs on project overview page
    - Placeholder users
    - Read-only mode for work packages
    - Team planner
    - Display relations in the work package table | **All from Basic +**
    **Professional Enterprise add-ons**:
    - Single sign-on (OIDC & SAML)
    - OneDrive and SharePoint integrations
    - Share work packages with external users
    - Automatic work package subject generation
    - Internal work package comments | **All from Professional +**
    **Premium Enterprise add-ons**:
    - Portfolio management
    - Share project lists
    - LDAP users and group sync
    \- Customize project life cycle
    - Calculated values for project evaluation and scoring
    | **All from Premium +**
    **Corporate Enterprise add-ons**:
    - Storage single sign-on for Nextcloud
    - Nextcloud Hub integration
    - openDesk integration
    - SCIM API integration
    - Antivirus scanning | +| **All [Community features](https://www.openproject.org/pricing/#features)** | **All Community features +**
    **Basic Enterprise add-ons**:
    - Baseline comparisons
    - Status boards (Kanban)
    - Assignee boards
    - Version boards
    - Subproject boards
    - Parent-child boards (Work Breakdown Structure)
    - Intelligent workflows with custom action buttons
    - Custom fields of type hierarchy
    - Date alerts
    - Custom theme and logo
    - Configure work package forms
    - Gantt charts PDF export
    - Graphs on project overview page
    - Placeholder users
    - Read-only mode for work packages
    - Team planner
    - Display relations in the work package table | **All from Basic +**
    **Professional Enterprise add-ons**:
    - Single sign-on (OIDC & SAML)
    - OneDrive and SharePoint integrations
    - Share work packages with external users
    - Automatic work package subject generation
    - Internal work package comments | **All from Professional +**
    **Premium Enterprise add-ons**:
    - Portfolio management
    - Share project lists
    - LDAP users and group sync
    - Project initiation request
    \- Customize project life cycle
    - Calculated values for project evaluation and scoring
    - Capture external links
    | **All from Premium +**
    **Corporate Enterprise add-ons**:
    - Storage single sign-on for Nextcloud
    - Nextcloud Hub integration
    - openDesk integration
    - SCIM API integration
    - Antivirus scanning | ### Testing the new Enterprise add-ons diff --git a/docs/getting-started/projects/README.md b/docs/getting-started/projects/README.md index e8480934b0c..5eef32ed581 100644 --- a/docs/getting-started/projects/README.md +++ b/docs/getting-started/projects/README.md @@ -74,8 +74,9 @@ There are several ways to create a new project in OpenProject. Keep in mind that ### Choose how to create your project You can create either: -- a **blank project** (a completely new and empty project), or -- a project **based on a template**. +- a **blank project** (a completely new and empty project), +- a project **based on a template**, +- a project **based on [project initiation request (Enterprise add-on)](../../user-guide/projects/project-initiation-request)** process The **Blank project** option is selected by default. @@ -107,6 +108,12 @@ Click **Complete** to finish the setup. ![Fill out a required project attribute during new project creation in OpenProject](openproject_getting_started_create_new_project_attributes.png) +### Project initiation request (Enterprise add-on) + +If a project imitation request was configured for the template you are using, after project creation you will be guided through additional pre-defined steps. + +Read more about [project initiation request (Enterprise add-on)](../../user-guide/projects/project-initiation-request). + ### Project members The project members of a newly created project depend on how the project was created: diff --git a/docs/glossary/README.md b/docs/glossary/README.md index b7b488edd9a..80e3bac562a 100644 --- a/docs/glossary/README.md +++ b/docs/glossary/README.md @@ -63,10 +63,10 @@ In OpenProject, authentication is an important element to guarantee a data prote **More information on authentication in OpenProject** -- [See answers to frequently asked questions (FAQ) for authentication](../system-admin-guide/authentication/authentication-faq/) -- [See our blog post on multi-factor authentication to improve data security](https://www.openproject.org/blog/multi-factor-authentication-for-data-security/) -- [Read more about Two-factor authentication (2FA) in OpenProject](../system-admin-guide/authentication/two-factor-authentication/) -- [Read more about LDAP Authentication in OpenProject](../system-admin-guide/authentication/ldap-connections/) +- [See answers to frequently asked questions (FAQ) for authentication](../system-admin-guide/authentication/authentication-faq/). +- [See our blog post on multi-factor authentication to improve data security](https://www.openproject.org/blog/multi-factor-authentication-for-data-security/). +- [Read more about Two-factor authentication (2FA) in OpenProject](../system-admin-guide/authentication/two-factor-authentication/). +- [Read more about LDAP Authentication in OpenProject](../system-admin-guide/authentication/ldap-connections/). ## B @@ -111,10 +111,10 @@ OpenProject can be installed either [on-premises](#on-premises) (available for b **More information on cloud hosting for OpenProject** -- [Read a blog article on OpenProject's cloud project management software](https://www.openproject.org/blog/cloud-project-management-software/) -- [See OpenProject's prices and plans](https://www.openproject.org/pricing) -- [Read a blog article on why to choose an open source cloud software](https://www.openproject.org/blog/open-source-cloud-software/) -- [See the FAQ for OpenProject Enterprise cloud](../enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/) +- [Read a blog article on OpenProject's cloud project management software](https://www.openproject.org/blog/cloud-project-management-software/). +- [See OpenProject's prices and plans](https://www.openproject.org/pricing). +- [Read a blog article on why to choose an open source cloud software](https://www.openproject.org/blog/open-source-cloud-software/). +- [See the FAQ for OpenProject Enterprise cloud](../enterprise-guide/enterprise-cloud-guide/enterprise-cloud-faq/). ### Community edition @@ -133,9 +133,9 @@ A custom action in OpenProject is defined as customizable buttons which trigger **More information on custom actions in OpenProject** -- [Watch a short video how custom actions work](../system-admin-guide/manage-work-packages/custom-actions/#automated-workflows-with-custom-actions-enterprise-add-on) -- [Read this guide on how to create custom actions](../system-admin-guide/manage-work-packages/custom-actions/#create-custom-actions) -- [Read this blog article on how to create an intelligent workflow with custom action - explained with an example](https://www.openproject.org/blog/customize-workflows/) +- [Watch a short video how custom actions work](../system-admin-guide/manage-work-packages/custom-actions/#automated-workflows-with-custom-actions-enterprise-add-on). +- [Read this guide on how to create custom actions](../system-admin-guide/manage-work-packages/custom-actions/#create-custom-actions). +- [Read this blog article on how to create an intelligent workflow with custom action - explained with an example](https://www.openproject.org/blog/customize-workflows/). ### Custom field @@ -309,10 +309,10 @@ OpenProject on-premises is a self-hosted version of OpenProject. As opposed to t **More information on OpenProject on-premises** -- [See our pricing side about your options for OpenProject](https://www.openproject.org/pricing/) -- [Read a blog article comparing on-premises and cloud](https://www.openproject.org/blog/why-self-hosting-software/) -- [Read how to activate the Enterprise on-premises edition](../enterprise-guide/enterprise-on-premises-guide/activate-enterprise-on-premises/) -- [Read how to start a trial for Enterprise on-premises](../enterprise-guide/enterprise-on-premises-guide/enterprise-on-premises-trial/) +- [See our pricing side about your options for OpenProject](https://www.openproject.org/pricing/). +- [Read a blog article comparing on-premises and cloud](https://www.openproject.org/blog/why-self-hosting-software/). +- [Read how to activate the Enterprise on-premises edition](../enterprise-guide/enterprise-on-premises-guide/activate-enterprise-on-premises/). +- [Read how to start a trial for Enterprise on-premises](../enterprise-guide/enterprise-on-premises-guide/enterprise-on-premises-trial/). ### OpenID Connect (OIDC) @@ -386,6 +386,13 @@ Open the project home by navigating to "Project home" in the project menu on the The project identifier is defined as the unique name used to identify and reference projects in the application as well as in the address bar of your browser. Project identifiers can be changed in the [project settings](#project-settings). +### Project initiation request + +A project initiation request (PIR) is a formal request to start a project, used in frameworks such as [PM²](#pm--pm2) and [PMflex](#pmflex) to collect key information before a project is initiated. In OpenProject, an automated PIR wizard is available as an [Enterprise add-on](#enterprise-add-on) to standardize project initiation and reduce manual effort. The term is also referred to as *project creation wizard* or *project mandate*. + +- [Read more about project initiation requests in PM²](../project-management-guide/5-initiating-phase/#52-project-initiation-request). +- [Read more about OpenProject’s Enterprise add-on for automated project initiation requests](../user-guide/projects/project-initiation-request/). + ### Project life cycle In OpenProject, the project life cycle consists of [phases](#phase) and [phase gates](#phase-gate) that help you structure your projects and work packages methodically. By default, these follow the [PM² project management framework](#pm--pm2), using the phases *Initiating*, *Planning*, *Executing*, and *Closing*. @@ -545,8 +552,8 @@ In OpenProject, a [work package](../user-guide/work-packages/#overview) is defin **More information on work packages in OpenProject** -- [Read our user guide on work packages](../user-guide/work-packages/) -- [Read a blog article on how to work with work packages](https://www.openproject.org/blog/how-to-work-with-work-packages/) +- [Read our user guide on work packages](../user-guide/work-packages/). +- [Read a blog article on how to work with work packages](https://www.openproject.org/blog/how-to-work-with-work-packages/). ### Work package category diff --git a/docs/release-notes/16-6-7/README.md b/docs/release-notes/16-6-7/README.md new file mode 100644 index 00000000000..43bbf4be43f --- /dev/null +++ b/docs/release-notes/16-6-7/README.md @@ -0,0 +1,69 @@ +--- +title: OpenProject 16.6.7 +sidebar_navigation: + title: 16.6.7 +release_version: 16.6.7 +release_date: 2026-02-06 +--- + + # OpenProject 16.6.7 + + Release date: 2026-02-06 + + We released OpenProject [OpenProject 16.6.7](https://community.openproject.org/versions/2265). + The release contains several bug fixes and we recommend updating to the newest version. + Below you will find a complete list of all changes and bug fixes. + + + +## Security fixes + + + +### GHSA-q523-c695-h3hp - Stored HTML injection on time tracking + +An HTML injection vulnerability occurs in the time tracking function of OpenProject version 17.0.2. The application does not escape HTML tags, an attacker with administrator privileges can create a work package with the name containing the HTML tags and add it to the `Work package` section when creating time tracking. + + + +Responsibly disclosed by Researcher: Nguyen Truong Son ([truongson526@gmail.com](mailto:truongson526@gmail.com)) through the GitHub advisory. + + + +For more information, please see the [GitHub advisory #GHSA-q523-c695-h3hp](https://github.com/opf/openproject/security/advisories/GHSA-q523-c695-h3hp) + + + +### GHSA-x37c-hcg5-r5m7 - Command Injection on OpenProject repositories leads to Remote Code Execution + +An arbitrary file write vulnerability exists in OpenProject’s repository changes endpoint (`/projects/:project_id/repository/changes`) when rendering the “latest changes” view via `git log`. + + + +By supplying a specially crafted `rev` value (for example, `rev=--output=/tmp/poc.txt`), an attacker can inject `git log` command-line options. When OpenProject executes the SCM command, Git interprets the attacker-controlled `rev` as an option and writes the output to an attacker-chosen path. + + + +As a result, any user with the `:browse_repository` permission on the project can create or overwrite arbitrary files that the OpenProject process user is permitted to write. The written contents consist of `git log` output, but by crafting custom commits the attacker can still upload valid shell scripts, ultimately leading to RCE. The RCE lets the attacker create a reverse shell to the target host and view confidential files outside of OpenProject, such as `/etc/passwd`. + + + +This vulnerability was reported by user [sam91281](https://yeswehack.com/hunters/sam91281) as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + + + +For more information, please see the [GitHub advisory #GHSA-x37c-hcg5-r5m7](https://github.com/opf/openproject/security/advisories/GHSA-x37c-hcg5-r5m7) + + + + + + +## Bug fixes and changes + + + + + + + diff --git a/docs/release-notes/17-1-0/README.md b/docs/release-notes/17-1-0/README.md new file mode 100644 index 00000000000..7f9a62c4f98 --- /dev/null +++ b/docs/release-notes/17-1-0/README.md @@ -0,0 +1,249 @@ +--- +title: OpenProject 17.1.0 +sidebar_navigation: + title: 17.1.0 +release_version: 17.1.0 +release_date: 2026-02-11 +--- + + # OpenProject 17.1.0 + + Release date: 2026-02-11 + + We released [OpenProject 17.1.0](https://community.openproject.org/versions/2237). The release contains several bug fixes and we recommend updating to the newest version. In these Release Notes, we will give an overview of important feature changes. At the end, you will find a complete list of all changes and bug fixes. + + + + +## Important feature changes + +Take a look at our release video showing the most important features introduced in OpenProject 17.1.0: + +![Release video of OpenProject 17.1](https://openproject-docs.s3.eu-central-1.amazonaws.com/videos/OpenProject_17_1_release.mp4) + +### Automated project initiation request with a guided wizard (Enterprise add-on) + +[feature: project_creation_wizard ] + +OpenProject introduces a configurable wizard for project initiation requests. The wizard can be enabled per template project. + +[See our documentation to learn how to use the automated project initiation request with OpenProject](../../user-guide/projects/project-initiation-request/). + +#### Configurable project initiation wizard + +Administrators can configure a project initiation wizard to define how new project requests are submitted. This includes selecting which project attributes and sections are shown in the wizard, and which fields are required or optional. + +The wizard guides users step by step through the initiation process using a fullscreen, three-column layout with section navigation, contextual help, and a progress indicator. Instead of completing required project attributes during project creation, users provide this information as part of the initiation request. + +![OpenProject wizard for a project initiation request, 3 column with different steps, currently shown: Project attributes, with help text on the right column.](openproject-17-1-project-initiation-request-wizard-attributes.png) + +#### Work package created for a project initiation request + +When a project initiation request is submitted for the first time, OpenProject automatically creates a work package that represents the request and serves as its central tracking artifact. + +The work package is created once based on the wizard configuration at the time of the initial submission, including the work package type, status, and initial assignee. The assignee can be derived from a project attribute or a project role, such as a project owner. + +>[!NOTE] +> If the project initiation request is submitted again later, the changes (like different assignee) might not be automatically displayed in the work package and need to be manually updated. However, each submission generates a new PDF artifact, which is uploaded and linked to the existing work package. This allows changes to be reviewed and documented over time, while keeping the work package as the central place for processing the request using existing workflows. + +![OpenProject work package of type "Project initiation request" with a description including a link to the artifact, assignee and accountable and a comment automatically generated by the system.](openproject-17-1-project-initiation-request-work-package.png) + +#### Automatically generated project initiation artifact (PDF) + +Upon submission of the project initiation request, a PDF artifact is automatically generated. The artifact contains all information entered in the wizard and is attached to the corresponding work package for documentation and audit purposes. + +The artifact is updated automatically whenever the status of the project initiation request work package changes, ensuring that the documentation always reflects the current state. + +>[!NOTE] +> The project initiation request workflow is particularly well suited for structured frameworks such as PM² or PMflex, while remaining flexible enough to be used independently of any specific methodology. [Read this blog article for more information](https://www.openproject.org/blog/project-initiation-workflow-pm2/). + +### Updates for the Meetings module + +The Meetings module received several improvements that extend how meeting results are documented, reused, and shared. + +#### Add new or existing work packages as meeting outcomes + +Users can now add work packages as meeting outcomes, allowing teams to turn meeting results into actionable follow-up items without leaving the meeting context. They can either: + +- link an existing work package, or +- create a new work package as an outcome. + +Each linked work package automatically shows a reference to the meeting in its Meetings tab, making the connection between the agenda item and the follow-up item explicit. + +Since we already introduced multiple outcomes per agenda item in OpenProject 17.0, it is now also possible to link multiple work packages to the same agenda item. + +![OpenProject meeting showing dropdown options for Outcome button: Write outcome, Existing work package, New workpackage](openproject-17-1-meeting-outcome-work-package-highlighted.png) + +#### Show iCal responses in OpenProject + +Meeting participant responses such as accepted, declined, or tentative are now visible directly in the meeting sidebar. These responses are collected from calendar invitations (for example when an ICS event is sent by email or downloaded and shared), making it easier to see the current participation status of all attendees in OpenProject. + +![OpenProject meeting showing participants with statuses such as "accepted" or "maybe"](openproject-17-1-meetings-participtants-status-highlighted.png) + +#### Duplicate agenda items to the next recurring meeting occurrence + +Users can now duplicate agenda items to the next occurrence of a recurring meeting. This makes it possible to carry over open topics or recurring discussion points without recreating them manually. + +To duplicate an agenda item, users can select the corresponding option from the agenda item actions menu. The duplicated agenda item is added to the next meeting occurrence and can be edited independently. + +![OpenProject meeting showing option to duplicate an agenda item to the next meeting occurrence by clicking the More menu of an agenda item --> Duplicate --> Duplicate in next occurrence](openproject-17-1-meetings-duplicate-agenda-item.png) + +### Release Attribute highlighting to Community + +The Attribute highlighting feature, previously available only as an Enterprise add-on, is now included in the free Community plan. + +Users can configure attribute highlighting in work package table views by opening the table configuration and selecting the **Highlighting** tab. Attributes such as Status, Priority, and Finish date can be highlighted inline or applied as full-row highlights based on attribute values. This makes key attributes visually distinguishable directly in the work package list without opening individual items. + +[Read more about attribute highlighting in our documentation](../../user-guide/work-packages/work-package-table-configuration/#attribute-highlighting). + +Here's an example of highlighting work packages by priority: + +![A work package table in OpenProject, highlighted by Priority](openproject-attribute-highlighting-priority.png) + +### Capture external links (Enterprise add-on) + +[feature: capture_external_links ] + +With 17.1 OpenProject introduces an option to add a warning when accessing external links from formatted text, such as project descriptions, comments or wiki pages. The warning adds an additional security layer by making users aware that they are about to leave OpenProject. + +When users click on an external link, a confirmation dialog is displayed indicating that the link leads outside of OpenProject. This applies to links added by users, for example in descriptions, comments, or other text fields. In SaaS trial environments, external link handling is enforced to ensure that warnings for user-provided external links cannot be bypassed. + +[Read more about this warning on external links in our documentation](../../system-admin-guide/system-settings/external-links/). + +![Warning in OpenProject: "You are about to leave OpenProject and visit an external website. Please be aware that external websites are not under our control and may have different privacy and security policies. Are you sure you want to proceed to the following external link?" with button "continue to external website"](openproject-17-1-warning-external-link.png) + +### Show short and weight values for Hierarchy and Weighted item list fields (Enterprise add-on) + +Users now see an item’s short or weight wherever values from Hierarchy or Weighted item list custom fields (work packages) and project attributes are shown. This provides an extra hint to confirm that the right item was selected. + +This information is displayed in: +- Work package details (for assigned values). +- Work package tables (for assigned values). +- Project attributes (for assigned values). +- The tree view selector while selecting a value (work packages and projects). +- The admin Items tab when editing the field, including the tree overview. + +[Read more about custom fields in OpenProject](../../system-admin-guide/custom-fields/). + +![OpenProject administration for custom fields, example of "Bending factor" for different materials, each one displayed with a specific value in brackets, e.g. "Aluminium (0.4)".](openproject-17-1-custom-fields-values.jpg) + +### UX/UI updates with the Primer design system + +OpenProject 17.1 includes further UX/UI improvements. The following areas have been redesigned using the Primer design system: +- the Access tokens section in account settings, +- the Backlogs section in system administration, +- the password confirmation dialog. + +## Important technical changes + +### Improved performance in work package Activity tab + +OpenProject improved the performance of the work package Activity tab when working with a large number of comments and activities. Previously, work packages with a very high number of comments could cause the browser to become slow or unresponsive when opening the Activity tab. With this release, activities are now loaded progressively instead of all at once. An initial subset of activities is loaded first, and additional entries are fetched as needed, with a loading indicator shown while more items are being loaded. + +This change prevents browser freezes and significantly improves responsiveness when opening and navigating work packages with extensive activity histories. + + + +## Bug fixes and changes + + + + +- Bugfix: Loading spinner is unreadable on Time&Costs module when in dark mode \[[#58458](https://community.openproject.org/wp/58458)\] +- Bugfix: Inexplicable "The changes were retracted" journal entries \[[#59360](https://community.openproject.org/wp/59360)\] +- Bugfix: Date is not displayed according to chosen format in an auto-generated subject \[[#63481](https://community.openproject.org/wp/63481)\] +- Bugfix: Administration life cycle table header has a wrong height \[[#65634](https://community.openproject.org/wp/65634)\] +- Bugfix: Validation of essential OIDC claims causes server error when failing \[[#66289](https://community.openproject.org/wp/66289)\] +- Bugfix: Large amount of comments causes workpackage to freeze (missing lazy-loading and loading indicator for Activity tab) \[[#66552](https://community.openproject.org/wp/66552)\] +- Bugfix: Meeting email update is sent in sender's OP language \[[#67287](https://community.openproject.org/wp/67287)\] +- Bugfix: Fix accessibility issues in Angular templates detected by ESLint \[[#67399](https://community.openproject.org/wp/67399)\] +- Bugfix: BlockNote: searching for a non-existent work package results in placeholder string being saved in the editor \[[#67554](https://community.openproject.org/wp/67554)\] +- Bugfix: Checking off participants in a meeting does not keep scroll position \[[#67719](https://community.openproject.org/wp/67719)\] +- Bugfix: DangerDialog text is unnecessarily convoluted \[[#68377](https://community.openproject.org/wp/68377)\] +- Bugfix: Unable to save meeting agenda name after using browser autocomplete \[[#68478](https://community.openproject.org/wp/68478)\] +- Bugfix: Documents index page: loading indicator for search is old \[[#68625](https://community.openproject.org/wp/68625)\] +- Bugfix: Confirmation dialog is shown even when no changes are made to the text \[[#68654](https://community.openproject.org/wp/68654)\] +- Bugfix: Project CF of type user does not display groups or placeholder users \[[#68702](https://community.openproject.org/wp/68702)\] +- Bugfix: User List in cost report is generated unsorted \[[#68714](https://community.openproject.org/wp/68714)\] +- Bugfix: Error duplicating task with relation \[[#69309](https://community.openproject.org/wp/69309)\] +- Bugfix: Truncate the name in the project list \[[#69445](https://community.openproject.org/wp/69445)\] +- Bugfix: Timer cannot be started if log time modal has a mandatory field \[[#69483](https://community.openproject.org/wp/69483)\] +- Bugfix: Nexcloud returns 404 if OpenPorject app is not installed \[[#69492](https://community.openproject.org/wp/69492)\] +- Bugfix: Fine-tuning of margins in pdf exports \[[#69515](https://community.openproject.org/wp/69515)\] +- Bugfix: Error in PDF exports if font file storage is broken \[[#69625](https://community.openproject.org/wp/69625)\] +- Bugfix: Misleading text in Work Package meetings tab after mentioning WP in meeting outcome \[[#69646](https://community.openproject.org/wp/69646)\] +- Bugfix: Too many permissions required to fill out wizard \[[#69672](https://community.openproject.org/wp/69672)\] +- Bugfix: Button to open PIR should only be shown for users with Edit project attributes permission \[[#69723](https://community.openproject.org/wp/69723)\] +- Bugfix: "Move to next meeting" broken for past meetings \[[#69727](https://community.openproject.org/wp/69727)\] +- Bugfix: Can't move hierarchy element underneath an element with an "&" symbol in its title \[[#69966](https://community.openproject.org/wp/69966)\] +- Bugfix: project attributes have a border on mobile fields \[[#70100](https://community.openproject.org/wp/70100)\] +- Bugfix: Meeting series can't be deleted before opening the first occurrence \[[#70318](https://community.openproject.org/wp/70318)\] +- Bugfix: Project dropdown active project close button is misaligned. \[[#70334](https://community.openproject.org/wp/70334)\] +- Bugfix: Wrong helptext for "Allow remapping of existing users" \[[#70389](https://community.openproject.org/wp/70389)\] +- Bugfix: Project status button is missing colors in the dropdown \[[#70458](https://community.openproject.org/wp/70458)\] +- Bugfix: Fix flickering in the Handling of 404 errors in AvatarWithFallback \[[#70460](https://community.openproject.org/wp/70460)\] +- Bugfix: On mobile, global search result box shows a lot of white space \[[#70497](https://community.openproject.org/wp/70497)\] +- Bugfix: hocupocus logs \[onAuthenticate\] fetch failed and connection to collaboration server not possible \[[#70542](https://community.openproject.org/wp/70542)\] +- Bugfix: Images are broken on moved/duplicated meeting agenda item \[[#70585](https://community.openproject.org/wp/70585)\] +- Bugfix: If user cancels a meeting that is currently happening, the meeting disappears from list \[[#70609](https://community.openproject.org/wp/70609)\] +- Bugfix: Email wording is ambiguous for users who are uninvited from a meeting \[[#70610](https://community.openproject.org/wp/70610)\] +- Bugfix: Work package meetings tab only shows the last outcome \[[#70779](https://community.openproject.org/wp/70779)\] +- Bugfix: Calendar widget not visible with Firefox \[[#70792](https://community.openproject.org/wp/70792)\] +- Bugfix: Cannot update email header/footer due to emission address being 'not a valid email address' when mail\_from setting is pinned via env \[[#70906](https://community.openproject.org/wp/70906)\] +- Bugfix: API V3 allows reading/writing internal comments when the "Enable internal comments" project setting is disabled \[[#70979](https://community.openproject.org/wp/70979)\] +- Bugfix: "Move to next meeting" and "Duplicate in next meeting" select cancelled meeting \[[#71089](https://community.openproject.org/wp/71089)\] +- Bugfix: Every user can be set as a presenter for an agenda item \[[#71100](https://community.openproject.org/wp/71100)\] +- Bugfix: External link warning page cut off on mobile \[[#71103](https://community.openproject.org/wp/71103)\] +- Bugfix: Meeting invitation emails do not offer direct calendar integration \[[#71113](https://community.openproject.org/wp/71113)\] +- Bugfix: WP type drop-down is cut off on mobile \[[#71144](https://community.openproject.org/wp/71144)\] +- Bugfix: Hourly rates can be edited for non-members \[[#71226](https://community.openproject.org/wp/71226)\] +- Bugfix: Race Condition on OpenProject through /api/v3/work\_packages/{id}/watchers \[[#71234](https://community.openproject.org/wp/71234)\] +- Bugfix: PIR results in a 404 if a group of user is assigned to the submission \[[#71264](https://community.openproject.org/wp/71264)\] +- Bugfix: Change phrasing from 'Duplicate in next occurrence' to 'Duplicate in next meeting' \[[#71338](https://community.openproject.org/wp/71338)\] +- Bugfix: PIR with only a calculated value in one section breaks \[[#71384](https://community.openproject.org/wp/71384)\] +- Bugfix: PIR artifact is uploaded twice if attachments are selected as artifact storage method \[[#71403](https://community.openproject.org/wp/71403)\] +- Bugfix: Deleting a Time and Cost report results in an error \[[#71414](https://community.openproject.org/wp/71414)\] +- Bugfix: FrozenError in POST::API::Mcp#/ \[[#71444](https://community.openproject.org/wp/71444)\] +- Bugfix: Error messages on meeting participants leaked user names to unauthorized users \[[#71621](https://community.openproject.org/wp/71621)\] +- Feature: Empty state for meeting index pages \[[#59158](https://community.openproject.org/wp/59158)\] +- Feature: Work package meeting outcomes \[[#62093](https://community.openproject.org/wp/62093)\] +- Feature: Redesign the "My Account / Access token" page using Primer \[[#65411](https://community.openproject.org/wp/65411)\] +- Feature: Rename Nextcloud GroupFolder references to TeamFolder \[[#66722](https://community.openproject.org/wp/66722)\] +- Feature: Show shorts and weights of custom fields with hierarchical structure \[[#67594](https://community.openproject.org/wp/67594)\] +- Feature: Handle participation responses in incoming emails \[[#68453](https://community.openproject.org/wp/68453)\] +- Feature: Show document as separate tab on mobile \[[#68833](https://community.openproject.org/wp/68833)\] +- Feature: Non configurable project creation wizard \[[#68855](https://community.openproject.org/wp/68855)\] +- Feature: Configuration of project attributes to appear in the create wizard \[[#68858](https://community.openproject.org/wp/68858)\] +- Feature: Create work package to submit project initiation request \[[#68862](https://community.openproject.org/wp/68862)\] +- Feature: Templates define their own settings for the project wizard \[[#68943](https://community.openproject.org/wp/68943)\] +- Feature: PDF export of PM²/PMflex project initiation requests \[[#69001](https://community.openproject.org/wp/69001)\] +- Feature: Change enforcement of project attributes on creation for templates \[[#69034](https://community.openproject.org/wp/69034)\] +- Feature: On status update of the PIR work package, recreate the PDF \[[#69303](https://community.openproject.org/wp/69303)\] +- Feature: Primerise the Password Confirmation Dialog \[[#69354](https://community.openproject.org/wp/69354)\] +- Feature: "X-icon" above the project create form \[[#69356](https://community.openproject.org/wp/69356)\] +- Feature: Add the project name as PageHeader breadcrumb on the project initiation request \[[#69401](https://community.openproject.org/wp/69401)\] +- Feature: Button to open project creation wizard from overview \[[#69402](https://community.openproject.org/wp/69402)\] +- Feature: Add relative link to project initiation request from work package comment \[[#69403](https://community.openproject.org/wp/69403)\] +- Feature: Send out email when work package is created \[[#69414](https://community.openproject.org/wp/69414)\] +- Feature: Show breadcrumb with full project hierachy in Project Overview showing portfolios and programs \[[#69417](https://community.openproject.org/wp/69417)\] +- Feature: Allow duplicating/copy of agenda items to next meeting occurence \[[#69464](https://community.openproject.org/wp/69464)\] +- Feature: Primerize API settings form \[[#69702](https://community.openproject.org/wp/69702)\] +- Feature: Show participant response in Meeting UI \[[#69733](https://community.openproject.org/wp/69733)\] +- Feature: Responses before meeting was created should show up in iCal Feed \[[#69734](https://community.openproject.org/wp/69734)\] +- Feature: Primerize Backlogs Admin \[[#70194](https://community.openproject.org/wp/70194)\] +- Feature: Capture external links in user-provided contents \[[#70234](https://community.openproject.org/wp/70234)\] +- Feature: Send email notifications to all participants when a participant is added or removed \[[#70607](https://community.openproject.org/wp/70607)\] + + + + +## Contributions + +A very special thank you goes to Helmholtz-Zentrum Berlin, City of Cologne, Deutsche Bahn and ZenDiS for sponsoring released or upcoming features. Your support, alongside the efforts of our amazing Community, helps drive these innovations. Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes. Special thanks for reporting and finding bugs go to Johannes Baumgarten, Lea Fuchs, Александр Татаринцев, Stefan Weiberg, and Natalie Stettner. + +Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! This release we would like to particularly thank the following users: + +- [Haura Nabila Rinaldi](https://crowdin.com/profile/hauranblr), for a great number of translations into Indonesian. +- [arnegronkjaer](https://crowdin.com/profile/arnegronkjaer), for a great number of translations into Danish. + +Would you like to help out with translations yourself? Then take a look at our [translation guide](../../contributions-guide/translate-openproject/) and find out exactly how you can contribute. It is very much appreciated! diff --git a/docs/release-notes/17-1-0/openproject-17-1-custom-fields-values.jpg b/docs/release-notes/17-1-0/openproject-17-1-custom-fields-values.jpg new file mode 100644 index 00000000000..b06a3c57e10 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-custom-fields-values.jpg differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-meeting-outcome-work-package-highlighted.png b/docs/release-notes/17-1-0/openproject-17-1-meeting-outcome-work-package-highlighted.png new file mode 100644 index 00000000000..647ae25ccd2 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-meeting-outcome-work-package-highlighted.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-meetings-duplicate-agenda-item.png b/docs/release-notes/17-1-0/openproject-17-1-meetings-duplicate-agenda-item.png new file mode 100644 index 00000000000..e77d1de5864 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-meetings-duplicate-agenda-item.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-meetings-mark-as-attended-highlighted.png b/docs/release-notes/17-1-0/openproject-17-1-meetings-mark-as-attended-highlighted.png new file mode 100644 index 00000000000..f03dd73a81f Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-meetings-mark-as-attended-highlighted.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-meetings-participtants-status-highlighted.png b/docs/release-notes/17-1-0/openproject-17-1-meetings-participtants-status-highlighted.png new file mode 100644 index 00000000000..55211959eb9 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-meetings-participtants-status-highlighted.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-wizard-attributes.png b/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-wizard-attributes.png new file mode 100644 index 00000000000..fde3f0aafc3 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-wizard-attributes.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-work-package.png b/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-work-package.png new file mode 100644 index 00000000000..72605c03959 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-project-initiation-request-work-package.png differ diff --git a/docs/release-notes/17-1-0/openproject-17-1-warning-external-link.png b/docs/release-notes/17-1-0/openproject-17-1-warning-external-link.png new file mode 100644 index 00000000000..452dfd8ecd8 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-17-1-warning-external-link.png differ diff --git a/docs/release-notes/17-1-0/openproject-attribute-highlighting-priority.png b/docs/release-notes/17-1-0/openproject-attribute-highlighting-priority.png new file mode 100644 index 00000000000..27d0c2f6a04 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-attribute-highlighting-priority.png differ diff --git a/docs/release-notes/17-1-0/openproject-project-initiation-request-work-package.png b/docs/release-notes/17-1-0/openproject-project-initiation-request-work-package.png new file mode 100644 index 00000000000..f0c512cf774 Binary files /dev/null and b/docs/release-notes/17-1-0/openproject-project-initiation-request-work-package.png differ diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 4c76be60569..ea6e0ed403e 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,12 +13,24 @@ Stay up to date and get an overview of the new features included in the releases +## 17.1.0 + +Release date: 2026-02-11 + +[Release Notes](17-1-0/) + + ## 17.0.3 Release date: 2026-02-06 [Release Notes](17-0-3/) +## 16.6.7 + +Release date: 2026-02-06 + +[Release Notes](16-6-7/) ## 17.0.2 @@ -26,7 +38,6 @@ Release date: 2026-01-27 [Release Notes](17-0-2/) - ## 17.0.1 Release date: 2026-01-16 @@ -44,7 +55,6 @@ Release date: 2026-01-27 [Release Notes](16-6-6/) - ## 16.6.5 Release date: 2026-01-16 diff --git a/docs/security-and-privacy/processing-of-personal-data/README.md b/docs/security-and-privacy/processing-of-personal-data/README.md index dfb5e013737..6d6d548b33b 100644 --- a/docs/security-and-privacy/processing-of-personal-data/README.md +++ b/docs/security-and-privacy/processing-of-personal-data/README.md @@ -487,7 +487,7 @@ subgraph openproject[OpenProject] end subgraph nextcloud[Nextcloud] - groupfolder[Group folder app] + groupfolder[Team folders app] appopenprojectintegration[OpenProject integration app] nextcloudapi[API] end diff --git a/docs/system-admin-guide/api-and-webhooks/openproject_system_admin_guide_api.png b/docs/system-admin-guide/api-and-webhooks/openproject_system_admin_guide_api.png index 3ac17fcbb73..63d383f3d5b 100644 Binary files a/docs/system-admin-guide/api-and-webhooks/openproject_system_admin_guide_api.png and b/docs/system-admin-guide/api-and-webhooks/openproject_system_admin_guide_api.png differ diff --git a/docs/system-admin-guide/authentication/openid-providers/README.md b/docs/system-admin-guide/authentication/openid-providers/README.md index 13ba308349d..b123878e730 100644 --- a/docs/system-admin-guide/authentication/openid-providers/README.md +++ b/docs/system-admin-guide/authentication/openid-providers/README.md @@ -493,7 +493,7 @@ To apply the configuration after changes, you need to run the `db:seed` rake tas ## Troubleshooting -Q: After clicking on a provider badge, I am redirected to a signup form that says a user already exists with that login. +**Q: After clicking on a provider badge, I am redirected to a signup form that says a user already exists with that login.** A: This can happen if you previously created user accounts in OpenProject with the same email than what is stored in the OpenID provider. In this case, if you want to allow existing users to be automatically remapped to the OpenID provider, you should do the following: @@ -505,8 +505,6 @@ sudo openproject run console # docker-compose run --rm web bundle exec rails console ``` - - Once in the console you can then enter the following to enable the setting and leave the console. ```shell @@ -514,8 +512,15 @@ Setting.oauth_allow_remapping_of_existing_users = true exit ``` - - Then, existing users should be able to log in using their Azure identity. Note that this works only if the user is using password-based authentication, and is not linked to any other authentication source (e.g. LDAP) or OpenID provider. Note that this setting is set to true by default for new installations already. + +**Q: How can I automatically log users out of OpenProject after I delete them from the SSO provider?** + +A: OpenProject does not currently revalidate user sessions after the initial login of a user. So even if the SSO provider session expires +or the user is removed from the SSO provider, this will not immediately have an effect in OpenProject. [A feature was requested](https://community.openproject.org/wp/65072) to improve this flow. + +Workarounds that are available: +* Ensure that the SSO provider performs a backchannel logout for all sessions of the user upon account suspension +* Synchronize the user account via a provisioning integration, such as SCIM, to ensure that account suspensions are synchronized quickly diff --git a/docs/system-admin-guide/backlogs/README.md b/docs/system-admin-guide/backlogs/README.md index 2ff954e2876..5df6f687623 100644 --- a/docs/system-admin-guide/backlogs/README.md +++ b/docs/system-admin-guide/backlogs/README.md @@ -3,21 +3,68 @@ sidebar_navigation: title: Backlogs priority: 840 description: Configure backlogs in OpenProject. -keywords: configure backlogs, backlogs settings +keywords: configure backlogs, backlogs settings, story type, task type, burn chart, burnchart, burndown, burnup, sprint wiki, agile, scrum --- # Backlogs configuration -Configure your backlogs settings in OpenProject. +Backlogs settings let you tailor OpenProject’s Scrum features to match how your team plans and tracks work. By configuring story and task types, burn charts, and sprint wiki templates, you can ensure your backlogs and boards show the right work items and support consistent sprint planning and documentation. -Navigate to *Administration* -> *Backlogs* to set up your backlogs. +To configure Backlogs, navigate to *Administration* -> *Backlogs*. -You can configure the following in the backlogs settings: - -1. Set the work package types which should be used as **story types**. Hold Ctrl (or Cmd on Mac) to choose several types. The story types will appear in the Backlogs view (product backlog, wish list, sprint) and can be created, prioritized directly in the Backlogs view, e.g. EPIC, FEATURE, BUG. -2. Set the **task type**. The task type will appear in the task board to manage in your daily stand ups. - Please note: You can't use a work package type as story type *and* as task type. -3. Define to show **burn-down** or **burn-up** **chart**. -4. Set a template for **sprint wiki page**. If you create a wiki page with this name, e.g. sprintwiki, you will set up a new wiki page based on this template if you open it via the sprint drop-down menu in the backlogs view. This way, you can easily create templates for sprint review meetings or retrospectives. -5. Press the **Apply** button to save your changes. +Here you can: +- select work package types used as story and task types, +- choose how to display a burn chart (burn-up or burn-down), +- set a template for a sprint wiki page. ![Backlog settings in OpenProject administration](openproject_system_admin_guide_backlog_settings.png) + +## Story and task types + +In OpenProject, work packages can have different **types** (for example *User story*, *Task*, *Bug*, etc.). In the Backlogs settings, you define which of these work package types are used as **stories** and which type is used as **tasks** in the Backlogs module. + + - **Story types** are the work package types configured to be available in the **Backlogs** module. These types appear in backlogs versions, such as the product backlog, wish list, and sprint backlog (i.e., versions). Work packages of these types can be created, prioritized, and managed directly in Backlogs. + - **Task type** is the work package type that appears on [task boards](../../user-guide/backlogs-scrum/taskboard/) and is used to manage day-to-day work, for example during stand-ups. + +### Select story types + +The currently selected story types are shown in the **Selected type** section. Click the section to open the select panel, adjust the selection (multiple selections are possible), and click **Apply** to save your changes and close the panel. + +![Select story types for sprints in Backlog administration settings in OpenProject](openproject_system_admin_guide_backlogs_select_story_types.png) + +### Select task type + +The task type is configured in the same way as story types, but only one work package type can be selected. Click the **Selected types** section, choose one work package type, and click **Apply**. + +> [!NOTE] +> Work package types selected for Story types and Task types must be different. For example, a *User story* can be selected for a story type OR a task type, but not both at the same time. It will not be selectable for *Story types*, as long as it is selected as a *Task type*, and vice versa. + + +## Burn chart + +Burn charts visualize sprint progress over time and help the team track whether they are on course to meet the sprint goal. In OpenProject you can choose which **burn chart** to display in Backlogs. + +You can select: + +- **Burn-down chart**: shows how much work remains in the sprint. +- **Burn-up chart**: shows how much work has been completed and makes scope changes easier to spot. + +## Sprint wiki +With OpenProject you can set a template for the [**sprint wiki page**](../../user-guide/backlogs-scrum/work-with-backlogs/#sprint-wiki) to standardize how your team documents each sprint. Using a sprint wiki template makes it easy to create consistent pages for sprint goals, planning notes, review outcomes, and retrospective action items. + +For example, if you want to create a template page for all Sprint retros, follow these steps: + +1. Assign a name to the *Template for sprint wiki page* field, e.g. "Sprint retro". + +2. [Create a wiki page](../../user-guide/wiki/create-edit-wiki/#create-a-new-wiki-page) in the Wiki module of a project with the exact same name "Sprint retro". This is your sprint wiki template. Configure it to the needs of your team. + + ![Create a scrum wiki template in OpenProject](openproject_system_admin_guide_backlogs_wiki_template.png) + + + +3. You can create a new sprint wiki page directly from the sprint drop-down menu in the Backlogs module. The new wiki page will be based on the template, so you can reuse the same structure for every sprint. + +![New wiki page created based on a backlogs wiki template in OpenProject](openproject_system_admin_guide_backlogs_wiki_template_in_use.png) + +> [!TIP] +> +> If instead of creating a new wiki page you want to link a specific wiki page, you can assign a pre-defined wiki page to a [sprint version](../../user-guide/projects/project-settings/versions/). It can be assigned to multiple versions. This wiki page is maintained centrally, changing it will show changes for all linked versions. diff --git a/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlog_settings.png b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlog_settings.png index 1e6b2d1ed7d..d7ec683f5ef 100644 Binary files a/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlog_settings.png and b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlog_settings.png differ diff --git a/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_select_story_types.png b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_select_story_types.png new file mode 100644 index 00000000000..ab909828e9f Binary files /dev/null and b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_select_story_types.png differ diff --git a/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template.png b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template.png new file mode 100644 index 00000000000..9ebf1c633cb Binary files /dev/null and b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template.png differ diff --git a/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template_in_use.png b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template_in_use.png new file mode 100644 index 00000000000..b1e0b1e7eac Binary files /dev/null and b/docs/system-admin-guide/backlogs/openproject_system_admin_guide_backlogs_wiki_template_in_use.png differ diff --git a/docs/system-admin-guide/files/external-file-storages/health-status/README.md b/docs/system-admin-guide/files/external-file-storages/health-status/README.md index aa158792dda..7905ff92383 100644 --- a/docs/system-admin-guide/files/external-file-storages/health-status/README.md +++ b/docs/system-admin-guide/files/external-file-storages/health-status/README.md @@ -69,13 +69,13 @@ and suggested solutions. | Error code | Error description | Possible reasons | Next steps and solutions | |------------------------------------|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ERR_NC_HOST_NOT_FOUND | No Nextcloud server was found at the configured host URL. | There might be a typo or the URL has changed. | Check the configuration and enter a valid URL. | -| ERR_NC_DEPENDENCY_MISSING | A required dependency is missing on the file storage. | Either the Integration OpenProject app or the Group Folders app is not enabled in Nextcloud. | Add the missing dependency to the Nextcloud server. | -| ERR_NC_DEPENDENCY_VERSION_MISMATCH | A required dependency has an outdated version. | Either the Integration OpenProject app or the Group Folders app is outdated or was not updated to the officially minimal supported version. | Update your apps to the latest version. It might be necessary to update your Nextcloud server to the latest version in order to be able to install the latest app versions. | -| ERR_NC_GROUP_FOLDER_NOT_FOUND | The group folder could not be found. | The group folder used by the Integration OpenProject app was not found. This folder is usually named `OpenProject` and is owned by the group `OpenProject`. | The group folder is used only by the automatically managed project folders mode. Try to disable this option in the Nextcloud administration for the Integration OpenProject app and reenable it afterwards. | +| ERR_NC_DEPENDENCY_MISSING | A required dependency is missing on the file storage. | Either the Integration OpenProject app or the Team Folders app is not enabled in Nextcloud. | Add the missing dependency to the Nextcloud server. | +| ERR_NC_DEPENDENCY_VERSION_MISMATCH | A required dependency has an outdated version. | Either the Integration OpenProject app or the Team Folders app is outdated or was not updated to the officially minimal supported version. | Update your apps to the latest version. It might be necessary to update your Nextcloud server to the latest version in order to be able to install the latest app versions. | +| ERR_NC_TEAM_FOLDER_NOT_FOUND | The team folder could not be found. | The team folder used by the Integration OpenProject app was not found. This folder is usually named `OpenProject` and is owned by the group `OpenProject`. | The team folder is used only by the automatically managed project folders mode. Try to disable this option in the Nextcloud administration for the Integration OpenProject app and reenable it afterwards. | | ERR_NC_OAUTH_REQUEST_UNAUTHORIZED | The current user's token is invalid. | The token of the current user could not be used for accessing the remote file storage. | If the file storage is configure to do the *Two-Way OAuth2 authorization code flow* remove the user token from **Account settings → Access tokens** of this file storage and redo the login. If the storage is configured to use SSO login, please recheck the [SSO configuration guide](../../../integrations/nextcloud/oidc-sso/) for the settings of OpenProject and Nextcloud of your specific setup. | | ERR_NC_USERLESS_ACCESS_DENIED | The userless request was unauthorized | The configured app password is invalid. | Generate a new app password in the Nextcloud administration section of the Integration OpenProject app and copy it over to the OpenProject file storage configuration form. | | WRN_NC_OAUTH_TOKEN_MISSING | The current user has no authentication token. | The current user probably never did a successful login from OpenProject to the file storage, or the token was deleted from the account details. | Visit any work package of a project, where the current file storage is used. Click on the **Login** button in the **Files** tab. | -| WRN_NC_UNEXPECTED_CONTENT | The connection request was successful, but unexpected content was found in the group folder. | The group folder `OpenProject` might contain data, that was put there by a user, or there are remnants from projects that no longer have a valid connection in OpenProject. | Go to Nextcloud and migrate or delete the data in the OpenProject group folder, that was not created by OpenProject. Further information about the unexpected data is found in the server logs. | +| WRN_NC_UNEXPECTED_CONTENT | The connection request was successful, but unexpected content was found in the team folder. | The team folder `OpenProject` might contain data, that was put there by a user, or there are remnants from projects that no longer have a valid connection in OpenProject. | Go to Nextcloud and migrate or delete the data in the OpenProject team folder, that was not created by OpenProject. Further information about the unexpected data is found in the server logs. | The officially minimal supported app versions are listed in the [system admin guide](../../../../system-admin-guide/integrations/nextcloud/#required-system-versions). diff --git a/docs/system-admin-guide/integrations/excel-synchronization/README.md b/docs/system-admin-guide/integrations/excel-synchronization/README.md index 44f53c5c927..be28a3b189f 100644 --- a/docs/system-admin-guide/integrations/excel-synchronization/README.md +++ b/docs/system-admin-guide/integrations/excel-synchronization/README.md @@ -1,7 +1,7 @@ --- sidebar_navigation: title: Excel synchronization - priority: 599 + priority: 400 description: Excel synchronization with OpenProject keywords: Excel --- diff --git a/docs/system-admin-guide/integrations/mcp-server/README.md b/docs/system-admin-guide/integrations/mcp-server/README.md new file mode 100644 index 00000000000..5496c37ba0e --- /dev/null +++ b/docs/system-admin-guide/integrations/mcp-server/README.md @@ -0,0 +1,27 @@ +--- +sidebar_navigation: + title: MCP Server + priority: 500 +description: Integrate AI agents with your OpenProject instance through MCP. +keywords: ai llm mcp +--- +# MCP Server + +> [!IMPORTANT] +> MCP server is an experimental feature that's not yet intended for production usage. It must be enabled on the page for experimental +> features of your OpenProject instance (found under `/admin/settings/experimental`). Future versions might change this feature in a breaking +> way, as we still look for user feedback on this feature. + +[feature: mcp_server ] + +OpenProject allows AI agents and similar tools to integrate through an API called **Model Context Protocol** (MCP). + +TODO: Further explanation of use cases + +## Configuration + +TODO: How to configure the MCP client to connect to OpenProject + +## Customization + +TODO: What can be customized in the Admin UI diff --git a/docs/system-admin-guide/integrations/nextcloud/README.md b/docs/system-admin-guide/integrations/nextcloud/README.md index 79700cf75f6..780852c948e 100644 --- a/docs/system-admin-guide/integrations/nextcloud/README.md +++ b/docs/system-admin-guide/integrations/nextcloud/README.md @@ -127,7 +127,7 @@ In case you want to use this functionality you will be requested to enter a pass ![Nextcloud Automatically managed folders](openproject_system_guide_nextcloud_integration_setup_step_9.png) > [!IMPORTANT] -> You will need to install the [Group folder](https://apps.nextcloud.com/apps/groupfolders) app in Nextcloud in order to have OpenProject automatically managed your Nextcloud folders. Each storage can only have one group folder with the same name. +> You will need to install the [Team folders](https://apps.nextcloud.com/apps/groupfolders) app in Nextcloud in order to have OpenProject automatically managed your Nextcloud folders. Each storage can only have one team folder with the same name. > [!NOTE] > When you use the **Terms of Service** app on the Nextcloud side, all terms also need to be accepted for the OpenProject user that gets created during the setup. This is set to happen automatically during the initial set-up. If you see an error message indicating otherwise or the integration does not behave as expected, please refer to the [Troubleshooting](#troubleshooting) section at the bottom of this page. @@ -244,19 +244,19 @@ To fix this please log into Nextcloud, proceed to Administration and select Open #### While setting up Project folders -While setting up the project folders we create a new user, group and group folder named `OpenProject`. At the time of set up the system expects either all of these entities to have been set up with proper permissions or none of them to be present. If one or more of these entities are present without required permissions, an error message will be displayed. +While setting up the project folders we create a new user, group and team folder named `OpenProject`. At the time of set up the system expects either all of these entities to have been set up with proper permissions or none of them to be present. If one or more of these entities are present without required permissions, an error message will be displayed. ##### Error message "The user "OpenProject" already exists" -On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The user "OpenProject" already exists"**. This error occurs if user `OpenProject` exists but group `OpenProject` and/or group folder `OpenProject` doesn't exist, or they exist with broken permissions. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) +On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The user "OpenProject" already exists"**. This error occurs if user `OpenProject` exists but group `OpenProject` and/or team folder `OpenProject` doesn't exist, or they exist with broken permissions. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) ##### Error message "The group "OpenProject" already exists" -On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The group "OpenProject" already exists"**. This can occur if group or group folder `OpenProject` exists but the user `OpenProject` doesn't exist. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) +On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The group "OpenProject" already exists"**. This can occur if group or team folder `OpenProject` exists but the user `OpenProject` doesn't exist. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) -##### Error message "The group folder name "OpenProject" already exists" +##### Error message "The team folder name "OpenProject" already exists" -On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The group folder name "OpenProject" already exists"**. This can occur if both group and user `OpenProject` doesn't exist but the group folder `OpenProject` exists. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) +On Nextcloud inside the _OpenProject Integration_ App, when setting up an OpenProject user, group and folder, it shows the error **"The team folder name "OpenProject" already exists"**. This can occur if both group and user `OpenProject` doesn't exist but the team folder `OpenProject` exists. To solve this problem refer to possible solutions in section [Possible solutions to Project folders setup error](#possible-solutions-to-project-folders-setup-error) ##### Possible solutions to Project folders setup error @@ -267,7 +267,7 @@ If you are facing any of the aforementioned errors while trying to set up the `P - Remove user `OpenProject` - Remove group `OpenProject` -- Inside the _Group folders_ App (*Administration settings → Administration → Group folders*), remove group folder `OpenProject`. +- Inside the _Team folders_ App (*Administration settings → Administration → Team folders*), remove team folder `OpenProject`. **Caution: this step will delete all files in that folder. Make sure to make a copy if you want to keep these files!** - Enable the _OpenProject Integration_ App @@ -279,10 +279,10 @@ If you do care about the `OpenProject` user/group/folder data then the condition - Group `OpenProject` doesn't exist. Please check if the group exists, if not create a group named `OpenProject`. - User `OpenProject` is not a member of group `OpenProject`. Please check the user is a member of the group, if not add the user `OpenProject` to the group `OpenProject`. - User `OpenProject` is not group admin of group `OpenProject`. Please check the user is admin of the group, if not make user `OpenProject` the group admin of group `OpenProject` -- Group folder `OpenProject` doesn't exist. If you don't have the _Group folders_ App installed, please install and enable it. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*) make a group folder named `OpenProject`. Add the group `OpenProject` to the group folder with all the permissions i.e. Write, Share, Delete. Add user `OpenProject` to advance permissions list. -- Group folder `OpenProject` is not assigned to group `OpenProject`. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*) check if the `OpenProject` group folder has group `OpenProject` assigned to it, if not add the group `OpenProject` with all the permissions i.e. Write, Share, Delete. -- Group `OpenProject` doesn't have all the permissions for group folder `OpenProject`. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*) check if the group `OpenProject` has all the permissions for group folder `OpenProject`, if not give group `OpenProject` all the permissions i.e. Write, Share, Delete. -- User `OpenProject` doesn't have advanced permissions for group folder `OpenProject`. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*) check if the user `OpenProject` has advanced permissions for group folder `OpenProject`, if not add user `OpenProject` to advanced permissions list. +- Team folder `OpenProject` doesn't exist. If you don't have the _Team folders_ App installed, please install and enable it. Inside the _Team folders_ App (*Administration settings → Administration → Team folders*) make a team folder named `OpenProject`. Add the group `OpenProject` to the team folder with all the permissions i.e. Write, Share, Delete. Add user `OpenProject` to advance permissions list. +- Team folder `OpenProject` is not assigned to group `OpenProject`. Inside the _Team folders_ App (*Administration settings → Administration → Team folders*) check if the `OpenProject` team folder has group `OpenProject` assigned to it, if not add the group `OpenProject` with all the permissions i.e. Write, Share, Delete. +- Group `OpenProject` doesn't have all the permissions for team folder `OpenProject`. Inside the _Team folders_ App (*Administration settings → Administration → Team folders*) check if the group `OpenProject` has all the permissions for team folder `OpenProject`, if not give group `OpenProject` all the permissions i.e. Write, Share, Delete. +- User `OpenProject` doesn't have advanced permissions for team folder `OpenProject`. Inside the _Team_ folders_ App (*Administration settings → Administration → Team folders*) check if the user `OpenProject` has advanced permissions for team folder `OpenProject`, if not add user `OpenProject` to advanced permissions list. > [!NOTE] > The name `OpenProject` is case-sensitive, so should be in exactly that format. @@ -298,7 +298,7 @@ If you face an error while trying to delete or disable user/group "OpenProject" 2. Remove user `OpenProject` 3. Remove group `OpenProject` -4. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*), remove group folder `OpenProject`. +4. Inside the _Team folders_ App (*Administration settings → Administration → Team folders*), remove team folder `OpenProject`. > [!WARNING] > This step will delete all files in that folder. Make sure to make a copy if you want to keep these files!** @@ -373,9 +373,9 @@ If that also not work please check the [instructions for setting up pretty URLs #### Files are not encrypted when using Nextcloud server-side encryption > [!NOTE] -> If your Nextcloud server uses server-side encryption, the GroupFolder encryption needs to be manually enabled. -> This is relevant for automatically managed project folders, as the GroupFolder app is used in these cases. -To enable encryption for GroupFolders, run the following command on your Nextcloud server: +> If your Nextcloud server uses server-side encryption, encryption of the team folder needs to be manually enabled. +> This is relevant for automatically managed project folders, as the Team Folders app is used in these cases. +To enable encryption for team folders, run the following command on your Nextcloud server: ```shell occ config:app:set groupfolders enable_encryption --value="true" diff --git a/docs/system-admin-guide/integrations/share-point/site-guide/README.md b/docs/system-admin-guide/integrations/share-point/site-guide/README.md index beea5a296a6..e2e3175de76 100644 --- a/docs/system-admin-guide/integrations/share-point/site-guide/README.md +++ b/docs/system-admin-guide/integrations/share-point/site-guide/README.md @@ -3,7 +3,7 @@ sidebar_navigation: title: SharePoint Site setup guide priority: 600 description: Site permission guide for SharePoint integration setup in OpenProject -keywords: SharePoint file storage integration, SharePoint, Sites.Selected, Sites Permission +keywords: SharePoint file storage integration, SharePoint, Sites.Selected, Sites Permission, share point, sharepoint --- # SharePoint Site setup guide @@ -13,7 +13,7 @@ keywords: SharePoint file storage integration, SharePoint, Sites.Selected, Sites You will need to grant the `manage` permission to the Azure Application so that the integration can work. > [!IMPORTANT] -> Some of the following descriptions are very tightly connected to the current (2025-10-29) state of SharePoint configuration. This may easily change in future, as we neither control, nor foresee changes to the configuration UI developed by Microsoft. +> Some of the following descriptions are very tightly connected to the current (2025-10-29) state of SharePoint configuration. This may easily change in future, as we neither control, nor foresee changes to the configuration UI developed by Microsoft. ### Authentication and permission diff --git a/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md b/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md index ee6a7204fd5..3a3557de120 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md @@ -19,11 +19,9 @@ You can adjust the following: 3. **Use current date as start date for new work packages**. This way the current date will always be set as a start date if your create new work packages. Also, if you copy projects, the new work packages will get the current date as start date. -4. **Default highlighting mode** defines which should be the default [attribute highlighting](../../../user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-enterprise-add-on) mode, e.g. to highlight the following criteria in the work package table. +4. **Default highlighting mode** defines which should be the default [attribute highlighting](../../../user-guide/work-packages/work-package-table-configuration/#attribute-highlighting) mode, e.g. to highlight the following criteria in the work package table. -[feature: conditional_highlighting ] - - ![default highlighting mode](openproject_system_guide_default_highlighting_mode.png) +![default highlighting mode](openproject_system_guide_default_highlighting_mode.png) 5. Customize the appearance of the work package lists to **define which work package attributes are displayed in the work package lists by default and in what order**. diff --git a/docs/system-admin-guide/system-settings/external-links/README.md b/docs/system-admin-guide/system-settings/external-links/README.md new file mode 100644 index 00000000000..be77605c03d --- /dev/null +++ b/docs/system-admin-guide/system-settings/external-links/README.md @@ -0,0 +1,28 @@ +--- +sidebar_navigation: + title: External links + priority: 950 +description: External links settings in OpenProject. +keywords: external links, link, links, capture link, redirect, warning, external site, external website +--- +# External links (Enterprise add-on) +[feature: capture_external_links ] + +You can configure how OpenProject handles **external links** in formatted text (for example, project descriptions, comments, or wiki content). When enabled, external links will be intercepted and users will see a warning page before leaving the application. This helps reduce the risk of users unknowingly opening unsafe websites. + +## Enable external link capture + +To enable the Capture external links setting navigate to *Administration ->System settings -> External links* and check the **Capture external links** option. Don't forget to save your changes. + +![Enable warning message for external links in OpenProject administration](openproject_system_admin_guide_external_links.png) + +Once enabled, OpenProject will redirect external links in formatted text through a warning page. + +![Example of a warning message for an external link in OpenProject](openproject_system_admin_guide_external_links_warning_message.png) + +## What is an external link? + +Links are considered external if they: + +- Are **not relative** (don’t point to the same server or application context), and +- Do **not start** with the configured **protocol** and **host name** of your OpenProject instance. diff --git a/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png new file mode 100644 index 00000000000..fee15cac661 Binary files /dev/null and b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png differ diff --git a/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links_warning_message.png b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links_warning_message.png new file mode 100644 index 00000000000..717da61c2ea Binary files /dev/null and b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links_warning_message.png differ diff --git a/docs/system-admin-guide/users-permissions/users/README.md b/docs/system-admin-guide/users-permissions/users/README.md index 137106285a7..47c0653a863 100644 --- a/docs/system-admin-guide/users-permissions/users/README.md +++ b/docs/system-admin-guide/users-permissions/users/README.md @@ -238,7 +238,7 @@ To delete another user's account open the [user list](#user-list). Click on the ![Sys-admin-delete-user](openproject_system_guide_delete_user.png) -You will then be asked to type in the username in order to delete the user permanently from the system, then confirm this with your password. +You will then be asked to confirm the deletion of the user permanently from the system. Checking the consent box will activate the **Delete permanently** button. ![delete user](delete-user-confirmation.png) diff --git a/docs/system-admin-guide/users-permissions/users/delete-user-confirmation.png b/docs/system-admin-guide/users-permissions/users/delete-user-confirmation.png index 83161e7bcf6..80bbf6586cf 100644 Binary files a/docs/system-admin-guide/users-permissions/users/delete-user-confirmation.png and b/docs/system-admin-guide/users-permissions/users/delete-user-confirmation.png differ diff --git a/docs/system-admin-guide/users-permissions/users/openproject_system_guide_delete_user.png b/docs/system-admin-guide/users-permissions/users/openproject_system_guide_delete_user.png index a28411630dc..7ba416b88e7 100644 Binary files a/docs/system-admin-guide/users-permissions/users/openproject_system_guide_delete_user.png and b/docs/system-admin-guide/users-permissions/users/openproject_system_guide_delete_user.png differ diff --git a/docs/user-guide/account-settings/README.md b/docs/user-guide/account-settings/README.md index 132624d9379..cb3fde3ecec 100644 --- a/docs/user-guide/account-settings/README.md +++ b/docs/user-guide/account-settings/README.md @@ -224,23 +224,43 @@ If you have created backup codes before, they will be invalidated and will no lo ## Access tokens -To view and manage your OpenProject access tokens navigate to **Account settings** and choose **Access tokens** from the menu. -Access tokens allow you to grant external applications access to resources in OpenProject. +To view and manage your OpenProject access tokens navigate to **Account settings** and choose **Access tokens** from the menu. Access tokens allow you to grant external applications access to resources in OpenProject. -### API +![Access tokens overview in OpenProject account settings](openproject_account_settings_access_tokens.png) -API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs. If you have not yet created an API token, this list will be empty. You may need admin privileges to be able to create an API token. +Access tokens are organized into two tabs: Provider tokens and Client tokens. Provider tokens are generated by OpenProject and enable other applications to connect to it. Client tokens are generated by external applications and allow OpenProject to connect to them. -You can enable an API token under [*Administration -> API and webhooks*](../../system-admin-guide/api-and-webhooks/). +### Provider tokens + +Provider tokens are created in OpenProject and allow external applications to access OpenProject. They include API, iCalendar, iCalendar for meetings, OAuth, and RSS tokens. + +#### API + +API tokens allow third-party applications to communicate with this OpenProject instance via REST APIs. If no API tokens were created yet, this list will be empty. You can enable API REST web service and CORS under [*Administration -> API and webhooks*](../../system-admin-guide/api-and-webhooks/). ![Access tokens in OpenProject account settings](openproject_account_settings_access_tokens_api.png) -### iCalendar +To create a new API Token, click the **+ API Token**, name the token in the form that opens and click *Create* button. + +![Name and create a new API token in OpenProject](openproject_account_settings_access_tokens_api_create_new.png) + +A new API token will be generated and displayed. Please keep in mind that each token will only be displayed once when it is created, so it's important to copy and safely save it. Should you lose this information, you CAN delete old tokens and generate new ones. + +> [!TIP] +> We recommend using each token only for one purpose (e.g. a single application), so that you know exactly what needs to be replaced, should you need to delete it. + +![A message confirming successful generation of a new API storage in OpenProject](openproject_account_settings_access_tokens_api_generated.png) + +#### iCalendar iCalendar tokens allow users to subscribe to OpenProject calendars and view up-to-date work package information from external clients. -This list will be empty if you have no calendar subscriptions yet. Once you [subscribe to a calendar](../../user-guide/calendar/#subscribe-to-a-calendar), a list of all the calendars that you have subscribed to will appear here. The name of the calendar is clickable and will lead you directly to the respective calendar in OpenProject. +This list will be empty if you have no calendar subscriptions yet. -![OpenProject calendar list under account settings](openproject_account_settings_access_tokens_calendar_list.png) +![OpenProject calendar list under account settings showing no calendars were subscribed to yet](openproject_account_settings_access_tokens_calendar_list.png) + +Once you [subscribe to a calendar](../../user-guide/calendar/#subscribe-to-a-calendar), a list of all the calendars that you have subscribed to will appear here. The name of the calendar is clickable and will lead you directly to the respective calendar in OpenProject. + +![OpenProject calendar list under account settings showing calendar tokens](openproject_account_settings_access_tokens_calendar_list_with_content.png) You can delete an entry in the iCalendar list by clicking on the **Delete** icon. This will trigger a warning message asking you to confirm the decision to delete. By deleting this token you will no longer have access to OpenProject information in all the linked clients using this token. @@ -250,7 +270,7 @@ You will then see a message informing you that the the token und the iCal URL ar ![OpenProject calendar access token is invalid](openproject_account_settings_access_tokens_calendar_invalid.png) -### iCalendar for meetings +#### iCalendar for meetings iCalendar meeting tokens allow users to subscribe to all their meetings and view up-to-date meeting information in external clients. This list will be empty if you have no calendar subscriptions yet. Once you subscribe to a meetings calendar, a list of all the iCalendar meeting tokens will appear here. @@ -266,7 +286,6 @@ You can then name the subscription meeting token and click **Create subscription You will then see the newly generated token. > [!IMPORTANT] -> > This is the only time that it will be displayed. Make sure that you copy it and safely save it. ![A newly generated iCal meeting subscription token in OpenProject account settings](openproject_account_settings_access_tokens_subscribe_meetings_form_confirmation.png) @@ -275,28 +294,45 @@ To delete an iCal meeting token under Account settings click the *Delete* icon n ![Delete icon to remove a meeting iCal token under OpenProject account settings](openproject_account_settings_access_tokens_meetings_delete.png) -### OAUTH +#### OAuth -OAuth tokens allow third-party applications to connect with this OpenProject instance, for example Nextcloud (see [here](../../user-guide/file-management/nextcloud-integration/) how to set up Nextcloud integration). OAuth tokens can be created under [*Administration-> Authentication*](../../system-admin-guide/authentication/). +OAuth tokens allow third-party applications to connect with this OpenProject instance, for example Nextcloud (see [here](../../user-guide/file-management/nextcloud-integration/) how to set up Nextcloud integration). OAuth applications can be created under [*Administration-> Authentication*](../../system-admin-guide/authentication/). -If no third-party application integration has been activated yet, this list will be empty. Please contact your administrator to help you set it up. Once an integration has been set up, you will see the details here and will be able to delete any OAuth tokens by clicking on the **Delete** icon. +OAuth tokens are not created directly in OpenProject. Instead, the authorization process is started from the external application. During setup, you will be redirected to OpenProject to confirm access and then returned to the external application to complete the connection. + +If no third-party application integration has been activated yet, this list will be empty. Please contact your administrator to help you set it up. + +Once integrations exist, their tokens will appear here. You can revoke access at any time by selecting the **Delete** icon. Removing a token immediately removes the external application’s permission to act on your behalf, meaning it can no longer make API calls in your name. If you want to use the integration again, you will need to authorize it again. ![OpenProject OAuth tokens under My Account](openproject_account_settings_access_tokens_oauth.png) -### RSS +#### RSS RSS tokens allow users to keep up with the latest changes in this OpenProject instance via an external RSS reader. You can only have one active RSS token. -Create a new token by clicking the **+RSS token** button. This will create your token and trigger a message showing you the access token. +Create a new token by clicking the **RSS token** button. + +![OpenProject RSS token under account settings](openproject_account_settings_access_tokens_rss.png) +This will create your token and trigger a message showing you the access token. > [!IMPORTANT] > You will only be able to see the RSS access token once, directly after you create it. Make sure to copy it. -![OpenProject RSS token](openproject_account_settings_access_tokens_rss.png) +![New RSS token created in OpenProject](openproject_account_settings_access_tokens_rss_new.png) -### File storages +Once an RSS token was created, you will see the details here and will be able to delete it by clicking the **Delete** icon. -File Storage tokens connect your OpenProject instance with an external File Storage. If you have not yet logged into any of the file storages activated for your instance, this list will be empty. You can delete tokens by clicking on the **Delete** icon. +![Delete RSS token icon under OpenProject account settings](openproject_account_settings_access_tokens_rss_delete.png) + +### Client tokens + +Client tokens are generated by external applications and enable OpenProject to connect to them. + +#### OAuth + +OAuth client tokens allow this OpenProject instance to connect with external applications. + +If you have not yet linked your account to any of the integrations activated for your instance, this list will be empty. You can delete tokens by clicking the **Delete** icon. ![File storages access tokens under Account settings in OpenProject](openproject_account_settings_access_tokens_file_storages.png) diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens.png new file mode 100644 index 00000000000..6b251919955 Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api.png index 2f603f3402e..ba5150626de 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_create_new.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_create_new.png new file mode 100644 index 00000000000..d24e74605df Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_create_new.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_generated.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_generated.png new file mode 100644 index 00000000000..88e8d44a943 Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_api_generated.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_invalid.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_invalid.png index 70c1121db3e..da7f3e0d5a3 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_invalid.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_invalid.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list.png index dd3eb698605..c3ae17713f7 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list_with_content.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list_with_content.png new file mode 100644 index 00000000000..ba4f5117daa Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_calendar_list_with_content.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_delete_calendar.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_delete_calendar.png index 416441edd24..938f84c62f2 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_delete_calendar.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_delete_calendar.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_file_storages.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_file_storages.png index e6809026306..ba7e077a2a0 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_file_storages.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_file_storages.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_meetings_delete.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_meetings_delete.png index ce225f073ee..82494e51dab 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_meetings_delete.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_meetings_delete.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_oauth.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_oauth.png index c8c49374fa6..da4770d6f2d 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_oauth.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_oauth.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss.png index ac208512c1e..b6fbff57d67 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_delete.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_delete.png new file mode 100644 index 00000000000..66e4116d89b Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_delete.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_new.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_new.png new file mode 100644 index 00000000000..5cd7c493dff Binary files /dev/null and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_rss_new.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_button.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_button.png index 78bff35579c..48e0c04e11e 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_button.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_button.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form.png index 3aac376ad8a..9786533a83e 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form.png differ diff --git a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form_confirmation.png b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form_confirmation.png index c314b0ddc07..d41dee2048b 100644 Binary files a/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form_confirmation.png and b/docs/user-guide/account-settings/openproject_account_settings_access_tokens_subscribe_meetings_form_confirmation.png differ diff --git a/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md b/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md index ed44bc0f226..f3c2ea223dc 100644 --- a/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md +++ b/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md @@ -128,4 +128,7 @@ Here, you have all the tools for creating wiki pages at your disposal, with the ![Sprint wiki opened in OpenProject](openproject_user_guide_backlogs_wiki_opened.png) > [!NOTE] -> You can configure the sprint wiki template in the Administration -> Backlogs. If you create a wiki page with the respective name, e.g. "sprintwiki", all sprint wikis will use this wiki page as a template. \ No newline at end of file +> This wiki page can be linked to multiple versions. + +> [!TIP] +> If instead of linking a specific (central) wiki page, you want to create a new pre-structured wiki page per version (for example per Sprint), you can configure the [sprint wiki template](../../../system-admin-guide/backlogs/#sprint-wiki) in the Administration -> Backlogs. \ No newline at end of file diff --git a/docs/user-guide/meetings/README.md b/docs/user-guide/meetings/README.md index da0618e885e..4c7e2052307 100644 --- a/docs/user-guide/meetings/README.md +++ b/docs/user-guide/meetings/README.md @@ -3,7 +3,7 @@ sidebar_navigation: title: Meetings priority: 760 description: Manage meetings with agenda and meeting minutes in OpenProject. -keywords: meetings +keywords: meetings, meeting, meeting series, recurring meetings, meetings agenda --- # Meeting management @@ -17,13 +17,6 @@ Meetings in OpenProject allow you to manage and document your project meetings,
    -> [!IMPORTANT] -> With OpenProject 13.1 we introduced dynamic meetings alongside classic meetings. -> With OpenProject 15.3 dynamic meetings are replaced by [one-time meetings](one-time-meetings) and [recurring meetings](recurring-meetings) to further improve meeting management. -> With OpenProject 16.0 classic meetings were removed from OpenProject. - - - | Topic | Content | | --------------------------------------------------- | --------------------------------------------------------- | | [Meetings in OpenProject](#meetings-in-openproject) | How to open meetings in OpenProject. | @@ -89,6 +82,8 @@ You can also use the meetings filters to refine the list of meetings based on th You can subscribe to all your OpenProject meetings in an external calendar application (such as Outlook, Apple Calendar, or Open-Xchange). This provides a single, read-only calendar that stays up to date automatically, without relying on individual .ics email invites. +In addition to viewing meetings, subscribing to meetings allows you to **respond to meeting invitations directly from your calendar**. Your response (Accepted, Tentative, or Declined) is synchronized back to OpenProject and shown as your participation status in the meeting. + #### Create a subscription You can subscribe to OpenProject meetings either within the *Meetings* module, or from your [Account settings page](../account-settings/#icalendar). @@ -108,10 +103,14 @@ You will be guided through creating an iCal subscription token: 3. Add this URL to your external calendar to subscribe to your OpenProject meetings. -If you are only interested in a specific meeting, you can [download that specific meeting as an iCal event] -(/one-time-meetings/#download-a-meeting-as-an-icalendar-event) instead. +Once subscribed, meeting dates and updates are synchronized automatically. If you respond to a meeting invitation in your calendar, your participation status is updated in OpenProject and visible to meeting organizers and other participants. + +> [!NOTE] +> If you respond to a meeting invitation in your calendar before the meeting is fully created or visible in OpenProject, your response will still be applied once the meeting becomes available, as long as the calendar subscription remains active. + +If you are only interested in a specific meeting, you can [download that specific meeting as an iCal event](./one-time-meetings/#download-a-meeting-as-an-icalendar-event) instead. > [!TIP] -> If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/). +> If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/) and this [use case](../../use-cases/meeting-management/). > > Find out more about OpenProject as [open source meeting management software](https://www.openproject.org/collaboration-software-features/meeting-management/). diff --git a/docs/user-guide/meetings/meetings-faq/README.md b/docs/user-guide/meetings/meetings-faq/README.md index 1500c926ce7..a9686baa551 100644 --- a/docs/user-guide/meetings/meetings-faq/README.md +++ b/docs/user-guide/meetings/meetings-faq/README.md @@ -34,3 +34,13 @@ Yes, the Calendar widget on the [project home page](../../project-home/project-w ## What makes OpenProject a great choice for managing meetings? OpenProject stands out [a reliable open source solution for meeting management](https://www.openproject.org/collaboration-software-features/meeting-management/), especially for teams that value structure and transparency. Its dedicated meeting module allows users to prepare agendas, take detailed minutes, and link tasks directly to meetings — making follow-ups more actionable and clear. Because it’s part of a broader project and task management platform, everything stays connected and organized. With flexible access controls and the option to choose between a secure SaaS or on-premises setup, OpenProject supports both collaboration and data privacy. It’s particularly well-suited for teams looking for an open-source tool that supports efficient, accountable meetings. + +### What is the difference between calendar subscriptions and email notifications in OpenProject meetings? + +Calendar subscriptions and email notifications serve different purposes in OpenProject meetings. + +**Calendar subscriptions** are used for scheduling meetings in an external calendar (such as Outlook or Google Calendar). They allow you to view meetings in your calendar and respond to meeting invitations (accept, decline, or tentatively accept). Your response is synchronized back to OpenProject and shown as your participation status. +Learn more about [subscribing to meetings](../#subscribe-to-meetings). + +**Email notifications** are used to inform meeting participants about changes to a meeting, such as added or removed participants or updated meeting details. Email notifications do not allow you to respond to a meeting invitation, unless your openproject instance has incoming mail support enabled. +You can manage general email notification behavior in your [personal notification settings](../../notifications/notification-settings/). diff --git a/docs/user-guide/meetings/one-time-meetings/README.md b/docs/user-guide/meetings/one-time-meetings/README.md index bb5563c729c..ac313001d00 100644 --- a/docs/user-guide/meetings/one-time-meetings/README.md +++ b/docs/user-guide/meetings/one-time-meetings/README.md @@ -239,7 +239,13 @@ The participants list will show everyone invited to the meeting so far. Initiall ![A form showing invited and attending meeting participants in OpenProject](openproject_userguide_meetings_add_new_participants_form.png) -To remove a participant, click the *x* icon on the far right of their name. +To remove a participant, click the *x* icon on the far right of their name. + +Once participants are added, their **participation status** is shown in the meeting view. + +If participants are subscribed to meetings via an external calendar, they can respond to the meeting invitation directly from their calendar (Accepted, Tentative, or Declined). Their response is synchronized back to OpenProject and visible to meeting organizers and other participants. + +![Meeting participants with their status highlighted in an OpenProject meeting](openproject_userguide_meetings_participants_status.png) Once the meeting has started (status set to *In progress*), you can record attendance by selecting the **Mark as attended** button. @@ -247,7 +253,9 @@ Once the meeting has started (status set to *In progress*), you can record atten ### Send email to all participants -You can send an email reminder to all the meeting participants. Select the dropdown by clicking on the **More** (three dots) icon in the top right corner and select **Email calendar invite to all participants**. An email reminder with the meeting details (including a link to the meeting) is immediately sent to all invitees and attendees. +You can send an email reminder to all the meeting participants. Select the dropdown by clicking on the **More** (three dots) icon in the top right corner and select **Send email invite to participants**. An email reminder with the meeting details (including a link to the meeting) is immediately sent to all invitees and attendees. + +![Option to send email invite to meeting participants in an OpenProject meeting](openproject_userguide_meetings_send_email_invite.png) ### Email calendar updates @@ -263,41 +271,84 @@ You can always re-activate it by clicking the **Enable** icon. ![Icon to enable calendar updates for meeting changes in OpenProject one-time meetings](openproject_userguide_meetings_enable_calendar_updates.png) +> [!NOTE] +> Enabling or disabling email calendar updates does not affect calendar subscriptions. +> If you are unsure whether a meeting change will trigger an email or update your calendar subscription, see the [Meetings FAQ](../meetings-faq/#what-is-the-difference-between-calendar-subscriptions-and-email-notifications-in-openproject-meetings). + ## Meeting outcomes + +Meeting outcomes help you document what was discussed and decided during a meeting. You can capture outcomes as written notes (e.g. decisions or summaries) or as work packages to create follow-up tasks that stay connected to the meeting agenda. + ### Add agenda item outcomes -During a meeting, stakeholders will often take certain decisions, add useful information or note down follow-up points. In OpenProject, these can be added as outcomes to each agenda item. To note outcomes, the meeting status has to first be set to [in progress](#mark-meeting-in-progress). Once in progress, there will be a **+ Outcome** button at the end of each agenda item. To add an outcome, simply click this button. +During a meeting, stakeholders will often make relevant decisions, add useful information, or specify follow-up steps. In OpenProject, these can be added as outcomes to each agenda item. To note outcomes, the meeting status has to first be set to [in progress](#mark-meeting-in-progress). > [!TIP] -> > To be able to add *Agenda meeting outcomes*, **Manage outcomes** permission needs to be granted under [Roles and permissions](../../../system-admin-guide/users-permissions/roles-permissions/) in system administration. +Once a meeting is in progress, there will be a **+ Outcome** button at the end of each agenda item. Click **+ Outcome** and choose one of the following options: + +- [Write outcome](#write-outcome) +- [Existing work package](#existing-work-package) +- [New work package](#new-work-package) + ![Button to add an agenda outcome in OpenProject meetings](openproject_userguide_meetings_agenda_outcome_button.png) -An editor will appear, allowing you to enter and format text, similar to editing an agenda item. +#### Write outcome + +Use this option to add a written outcome, such as a decision, a short summary, or meeting notes. + +An editor will appear, allowing you to enter and format text, similar to editing an agenda item. ![Editor to enter or edit agenda item outcomes in OpenProject meetings](openproject_userguide_meetings_agenda_outcome_form.png) -Click **Save** to add the outcome agenda. +Click **Save** to add the agenda item outcome. > [!TIP] > > You can save multiple outcomes per agenda item in OpenProject. -After saving an agenda item outcome, you can still edit it. Click the **More** (three dots) menu on the right edge of each outcome item and select *Edit outcome*. +After saving a written outcome, you can still edit it. Click the **More** (three dots) menu on the right edge of each outcome item and select *Edit outcome*. ![Edit an agenda item outcome in OpenProject meetings](openproject_userguide_meetings_agenda_outcome_more_menu.png) -This menu also allows you to *Copy link to clipboard* and to *Remove the outcome*. +This menu also allows you to *Copy link to clipboard* and to *Remove the outcome*. + +#### Existing work package + +Use this option to add an already existing work package as a meeting outcome. This is helpful if the follow-up task already exists and you want to document that it was discussed during the meeting. + +You can use the search bar to search for a work package name or ID. + +![Add an existing work package as a meeting agenda item outcome in OpenProject](openproject_userguide_meetings_agenda_outcome_existing_wp_form.png) + +Once added, the work package will appear as an outcome under the agenda item. Work package outcomes can be removed again if needed. From the **More** (three dots) menu, you can copy the work package URL or remove the outcome. + +![Copy link or remove a work package outcome from an OpenProject meeting](openproject_userguide_meetings_agenda_outcome_existing_wp_edit.png) + +#### New work package + +Use this option to create a new work package directly from the meeting and add it as an outcome. This is useful for quickly creating follow-up tasks during the meeting while keeping them linked to the agenda item and meeting minutes. + +When you select **New work package**, a work package creation dialog will open. + +![Form to create a new work package as an agenda outcome in an OpenProject meeting](openproject_userguide_meetings_agenda_outcome_new_wp_form.png) + +After creating it, the new work package will be shown as an outcome under the agenda item. > [!TIP] -> Outcomes are also displayed in the Meetings tab of a work package in a read-only format. +> Creating work packages as meeting outcomes requires users to have both **Manage outcomes** and **Create work packages** permissions. + +### Agenda outcomes in work packages + +Meeting agenda outcomes are also displayed in the **Meetings** tab of the linked work package in a read-only format. They are marked with an **Added as outcome** label so that it is clear how the work package is connected to the meeting. ![Agenda item outcomes displayed in Meetings tab in a work package in OpenProject](openproject_userguide_meetings_agenda_outcome_in_work_package.png) + ## Meeting attachments -You can add attachments in the meetings in the **Attachments** section in the right bottom corner. You can either user the **+Attach files** link to select files from your computer or drag and drop them. +You can add attachments in the meetings in the **Attachments** section in the bottom right corner. You can either use the **+Attach files** link to select files from your computer or drag and drop them. Added attachments can be added to the Notes section of agenda packages by dragging and dropping them from the Attachments section. @@ -316,12 +367,17 @@ This will display meeting history details. ## Download a meeting as an iCalendar event -You can download a meeting as an iCalendar event. Select the dropdown by clicking on the **More** (three dots) menu in the top right corner and select the **Download iCalendar event**. +You can download a meeting as an iCalendar event. Select the dropdown by clicking on the **More** (three dots) menu in the top right corner and select the **Download iCalendar event**. Read more about [subscribing to a calendar](../../calendar/#subscribe-to-a-calendar). ![An icon to download a meeting as an iCalendar event in OpenProject meetings moduel](openproject_userguide_meetings_download_ical.png) +Please keep in mind that downloading a meeting as an iCalendar event adds it to your calendar, but it does not keep the meeting synchronized automatically. + +> [!TIP] +> If you want to respond to meeting invitations directly from your calendar and have your participation status synchronized back to OpenProject, you can [subscribe to meetings](../#subscribe-to-meetings) instead of downloading individual iCal events. + ## Change meeting status You can change the status of a meeting depending on whether you are preparing it, running it, or finalizing it. @@ -432,7 +488,7 @@ You can also specify the **Footer text**, which will appear on the bottom of eve ![A dialogue to specify the PDF export of a meeting in OpenProject](openproject_userguide_meetings_pdf_export_dialogue.png) -Click the **Download** button to generated a PDF. First page of the PDF is the title page. The generated PDF will include all the meeting details and agenda. Meeting participants, agenda outcomes, a list of attachments and backlog items will only be included if selected for the export. +Click the **Download** button to generate a PDF. First page of the PDF is the title page. The generated PDF will include all the meeting details and agenda. Meeting participants, agenda outcomes, a list of attachments and backlog items will only be included if selected for the export. > [!NOTE] > Macros from the editor macros dropdown are not supported in the PDF. diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_button.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_button.png index 1f5a442447a..3481c8e4f59 100644 Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_button.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_button.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_edit.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_edit.png new file mode 100644 index 00000000000..6be9ae7f0b0 Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_edit.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_form.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_form.png new file mode 100644 index 00000000000..519b62d80fc Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_existing_wp_form.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png index acc3c63e82b..d7b8a8aece4 100644 Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_new_wp_form.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_new_wp_form.png new file mode 100644 index 00000000000..d53ed02e319 Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_outcome_new_wp_form.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_mark_participants_attendance_button.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_mark_participants_attendance_button.png index 91b44e7e1e0..a270c99d750 100644 Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_mark_participants_attendance_button.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_mark_participants_attendance_button.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_participants_status.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_participants_status.png new file mode 100644 index 00000000000..925b24fef64 Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_participants_status.png differ diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_send_email_invite.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_send_email_invite.png new file mode 100644 index 00000000000..3f79bda64fe Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_send_email_invite.png differ diff --git a/docs/user-guide/meetings/recurring-meetings/README.md b/docs/user-guide/meetings/recurring-meetings/README.md index 7c947654ab4..39e79715f38 100644 --- a/docs/user-guide/meetings/recurring-meetings/README.md +++ b/docs/user-guide/meetings/recurring-meetings/README.md @@ -21,6 +21,7 @@ Recurring meetings are helpful to schedule and organize meetings that happen reg | [Edit recurring meetings template](#edit-recurring-meetings-template) | How to edit a template for recurring meeting series. | | [Edit recurring meeting series](#edit-recurring-meeting-series) | How to edit recurring meeting series in OpenProject. | | [Edit a recurring meeting occurrence](#edit-a-recurring-meeting-occurrence) | How to edit a single meeting within recurring meeting series. | +| [Meeting backlogs for recurring meetings](#meeting-backlogs-for-recurring-meetings) | How to edit backlogs for recurring meetings in OpenProject. | ## Create and edit recurring meetings @@ -137,6 +138,30 @@ In addition to all the options available when clicking on the three-dot **More** ![Move an agenda item to next meeting in OpenProject recurring meetings](openproject_userguide_meetings_recurring_move_agenda_item.png) +Clicking this option will display a confirmation dialog. + +![A confirmation dialogue for moving an agenda item into the the next meeting occurrence in OpenProject](openproject_userguide_meetings_recurring_move_agenda_item_confirmation.png) + +Confirming will move the agenda item and outcomes (if any exist) into the next immediate meeting occurrence. + +### Duplicate an agenda item to next meeting + +If you don’t want to move an agenda item to the next meeting (and remove it from the current one), but instead keep it in the current meeting protocol and still discuss it again next time, you can duplicate it to the next occurrence. + +This can be useful, for example, if an item was discussed but needs a follow-up in the next meeting, while the current meeting minutes should remain complete. + +To do duplicate an agenda item into the next meeting, open the three-dot **More (⋯)** menu of an agenda item and select Duplicate → Duplicate in next occurrence. + +![Duplicate an agenda item to next meeting in OpenProject recurring meetings](openproject_userguide_meetings_recurring_duplicate_agenda_item.png) + + + +Clicking this option will display a confirmation dialog. + +![A confirmation dialogue for duplicating an agenda item into the the next meeting occurrence in OpenProject](openproject_userguide_meetings_recurring_duplicate_agenda_item_confirmation.png) + +Confirming will create a copy of the agenda item in the next immediate meeting occurrence. Outcomes will not be duplicated. The original agenda item will remain in the current meeting, keeping the protocol intact. + ## Meeting backlogs for recurring meetings ### Series backlogs diff --git a/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item.png b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item.png new file mode 100644 index 00000000000..a02b891275b Binary files /dev/null and b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item.png differ diff --git a/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item_confirmation.png b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item_confirmation.png new file mode 100644 index 00000000000..9b1e077dd36 Binary files /dev/null and b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_duplicate_agenda_item_confirmation.png differ diff --git a/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_move_agenda_item_confirmation.png b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_move_agenda_item_confirmation.png new file mode 100644 index 00000000000..7ae0b5b6248 Binary files /dev/null and b/docs/user-guide/meetings/recurring-meetings/openproject_userguide_meetings_recurring_move_agenda_item_confirmation.png differ diff --git a/docs/user-guide/projects/project-initiation-request/README.md b/docs/user-guide/projects/project-initiation-request/README.md new file mode 100644 index 00000000000..f01ef76f762 --- /dev/null +++ b/docs/user-guide/projects/project-initiation-request/README.md @@ -0,0 +1,106 @@ +--- +sidebar_navigation: + title: Project initiation request + priority: 850 +description: Create new projects using a guided project initiation process in OpenProject. +keywords: project creation wizard, project initiation, project setup, new project, project template, PIR, pmflex, pm2 + +--- + +# Project initiation request (Enterprise add-on) +[feature: project_creation_wizard ] + +In **OpenProject**, you can create new projects using a guided pre-defined process. It is referred to as *project initiation request*, *project creation wizard* or *project mandate*. This is especially helpful in larger organizations, when managing many projects, or when working with complex structures and governance requirements. + +Instead of manually configuring each project from scratch, the wizard guides you through a defined sequence of steps to collect essential information and apply a consistent project setup. For example a department responsible for the project or key roles relevant to the project (team lead, product owner, etc.). This reduces setup effort, avoids configuration errors, and helps ensure that new projects follow agreed standards. + +As a result, project managers and teams can get started faster, while organizations maintain clarity and consistency across their OpenProject environment. + +## Before you start + +Before using the project initiation request, you need at least one project that is configured as a basis for the project initiation process. + +First, configure a project for use in the project initiation process. See how to do this under [project settings](project-initiation-request-settings/). + +When preparing a project for this purpose, consider configuring the following elements in advance: +- Project members, which will be copied to newly created projects +- Work packages, such as phases or milestones +- Versions +- Project attributes and default values +- Any other settings that reflect your organization’s project management approach + +Once configured, we **strongly** recommend marking the project as a **template**, because only projects set as templates are available during project creation process. See [how to set a project as a template](../project-templates/). + +You can repeat this process to make multiple project creation wizards available. + +## Step 1: Create a new project + +To start the project creation process, click **+ Project** button. Read more on creating a new project [here](../../../getting-started/projects/#create-a-new-project). + +![Button to create a new project in OpenProject](openproject_user_guide_project_creation_wizard_new_project.png) + +Select a relevant project template from the list of available templates and click **Continue**. + +![Select a project template during project creation in OpenProject](openproject_user_guide_project_creation_wizard_select_template.png) + +On the next screen, enter a project name and adjust the description if needed. The description is pre filled based on the selected template. + +Click **Complete** to continue. + +![Name a new project during a project initiation flow in OpenProject](openproject_user_guide_project_creation_wizard_name_project.png) + +This action triggers the project creation wizard. + +![Applying project initiation wizard template to a newly created project in OpenProject](openproject_user_guide_project_creation_wizard_applying_temlate.png) + +## Step 2: Fill out the project initiation request + +You will be taken to the first screen of the project creation wizard. + +The screen is divided into several areas: + +1. **Content section** on the left, showing all wizard steps +2. **Main section** in the center, where project attributes are filled out +3. **Help section** on the right, displaying help text (if defined for an attribute) +4. **Progress indicator**, showing your current position in the process +5. **Cancel** and **Continue** buttons at the bottom +6. **Close icon**, allowing you to exit the wizard and return later + +![Project creation wizard explained in OpenProject](openproject_user_guide_project_creation_wizard_explained.png) + +Fill out the required project attributes step by step. You can navigate between steps and return to incomplete fields at any time. + +> [!TIP] +> To ensure your entries are saved, always click **Continue** before moving between steps. Otherwise, entered data may be lost. + +Completed sections are marked with a green check icon in the **Content** section. + +![Green checkmark icon indicating completed wizard steps in OpenProject](openproject_user_guide_project_creation_wizard_green_checkmark.png) + +If you close the wizard before completing it, you will be taken to the project overview page. The project status will be set to *Not set*, and the project status widget will indicate that the project creation wizard has not yet been completed. + +To continue, click the **Open project creation wizard** button in the *Project status* widget. + +![Button to reopen the project creation wizard in OpenProject](openproject_user_guide_project_creation_wizard_return_button.png) + +## Step 3: Submit the project initiation request + +Once all required fields are completed, click **Complete** to submit the project initiation request. + +A new work package is created automatically. It contains: + +- A comment indicating that the project creation wizard was completed +- A generated PDF artifact with all submitted information attached for reference and audit purposes +- A link to reopen the project creation wizard if updates are needed + +The responsible person defined during initiation is assigned to the work package and mentioned in a comment indicating that the request is awaiting review. In this example this person was earlier defined during the project initiation request, in the project attribute field called *PIR controller*. + +![Confirmation message after submitting a project creation wizard in OpenProject](openproject_user_guide_project_creation_wizard_success_message.png) + +The generated PDF is available in the **Files** tab of the work package. + +![Files tab showing the generated project initiation PDF](openproject_user_guide_project_creation_wizard_wp_files_tab.png) + +You can reopen the wizard and update the information at any time. Each submission creates a new PDF file, which is added to the **Files** tab with a timestamp for easier comparison. + +Once submitted, the responsible person can proceed with reviewing and processing the project initiation request. \ No newline at end of file diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_applying_temlate.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_applying_temlate.png new file mode 100644 index 00000000000..a2b3d430ceb Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_applying_temlate.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_explained.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_explained.png new file mode 100644 index 00000000000..a1f934e5363 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_explained.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_green_checkmark.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_green_checkmark.png new file mode 100644 index 00000000000..bd8022fbeac Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_green_checkmark.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_name_project.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_name_project.png new file mode 100644 index 00000000000..b8272b02c90 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_name_project.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_new_project.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_new_project.png new file mode 100644 index 00000000000..cd757e2aa21 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_new_project.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_return_button.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_return_button.png new file mode 100644 index 00000000000..b3aa35984bf Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_return_button.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_select_template.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_select_template.png new file mode 100644 index 00000000000..74aecff6ebd Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_select_template.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_success_message.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_success_message.png new file mode 100644 index 00000000000..7312743f6e7 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_success_message.png differ diff --git a/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_wp_files_tab.png b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_wp_files_tab.png new file mode 100644 index 00000000000..84aa1a89e20 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/openproject_user_guide_project_creation_wizard_wp_files_tab.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/README.md b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/README.md new file mode 100644 index 00000000000..5875bac4397 --- /dev/null +++ b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/README.md @@ -0,0 +1,119 @@ +--- +sidebar_navigation: + title: Project initiation request settings + priority: 850 +description: Configure the project initiation request workflow for a project in OpenProject. +keywords: project initiation request, project creation wizard, project settings, project attributes, work packages, PDF export +--- + +# Project initiation request settings (Enterprise add-on) + +[feature: project_creation_wizard ] + +The **Project initiation request** settings allow you to configure how project initiation is handled in OpenProject. + +In this section, you define which project information is collected during initiation and how a user is guided through that process. You can also decide how the resulting initiation document is stored: either as a PDF attached directly to the artifact work package in OpenProject, or (if an external file storage is configured) as a link to a PDF stored outside of OpenProject. + +These settings help establish a consistent project creation process and ensure that key project details are specified before a project is created. + +To access these settings, navigate to **Project settings → Project initiation request**. + +> [!TIP] +> A project configured for the project initiation wizard does not technically need to be marked as a template. However, marking it as a template is **very strongly recommended**, as this includes the project in the project creation flow. Otherwise, the initiation request can only be used when copying that project. + +## Enable project initiation request + +The project initiation request feature is disabled by default for new projects. + +![Project initiation request of not enabled in OpenProject project settings](openproject_userguide_project_settings_pir_request_not_initiated.png) + +Once enabled, OpenProject provides a guided, step-by-step wizard that project managers can use to submit a project initiation request. You can configure which project attributes are included and how the resulting document is handled. + +Click **Enable** to start configuring the wizard. + +### Choose an artifact name + +Under the **Name** tab, you can select the name that will be used for the artifact created when a project initiation request is submitted. The chosen name should align with the terminology used in your organization or project management framework. + +![Tab to choose a name for the project initiation request flow under OpenProject project settings](openproject_userguide_project_settings_pir_request_name.png) + +You can choose from the following predefined options: +- Project creation wizard +- Project initiation request +- Project mandate + +The selected name determines how the artifact is labeled. It does not affect the structure or steps of the initiation process, which remain the same regardless of the selected name. + +Click **Save** to apply your selection. + +### Select project attributes + +Under the **Project attributes** tab, you can define which project information is collected during the project initiation request. + +Only project attributes that are enabled for the project are available for selection. This ensures that users are asked only for information that is relevant and supported in the current project context. + +![Tab to select project attributes for the project initiation request flow under OpenProject project settings](openproject_userguide_project_settings_pir_request_attributes.png) + +You can enable or disable either single project attributes or entire sections. + +> [!TIP] +> We recommend including at least one project attribute of type **User**, for example a role responsible for reviewing initiation requests. This attribute can later be used to automatically assign responsibility when the request is submitted. + +### Configure request submission + +Under the **Request submission** tab, you define what happens when a user submits a project initiation request. + +When a request is submitted, OpenProject creates a new work package and attaches the generated initiation artifact as a PDF. The settings in this section determine how that work package is created, assigned, and communicated. + +![Tab to specify submitting the project initiation request under OpenProject project settings](openproject_userguide_project_settings_pir_request_submission.png) + +You can configure the following: + +**Work package type** +Select the work package type used to store the completed initiation artifact, for example *Task*, *Milestone*, or *Phase*. + +**Status when submitted** +Choose the status that the work package will automatically transition to once the request is submitted. You can create [work package statuses](../../../../system-admin-guide/manage-work-packages/work-package-status/) to best fit your framework. + +**Assignee when submitted** +Select a project attribute of type **User**. The user assigned to this attribute during initiation will become the assignee of the newly created work package. + +> [!TIP] +> A project attribute of type User can have a specific role assignment configured for it: +> +> - If a role assignment is configured, any user of the application can be selected. This user will become member of the newly created project and the specified role will be assigned to them. +> - If no role assignment is configured, only members of the template project can be selected. + +**Work package comment** +Define the comment that is added to the work package when the request is submitted. The selected assignee will automatically be @mentioned in this comment. +A default comment is pre-filled and can be adjusted if needed. + +**Send confirmation email** +Enable this option to send a confirmation email to the user who submitted the project initiation request. + +Click **Save** to apply your changes. + + +### Define how the artifact is exported + +Under the **Artifact export** tab, you control how the generated initiation document is stored. + +![Tab to specify artifact export during the project initiation request under OpenProject project settings](openproject_userguide_project_settings_pir_request_artifact_export.png) + +You can choose between the following options: + +**Save as work package file attachment** +The generated document is stored as a PDF file attachment directly on the artifact work package in OpenProject. + +**Upload file to external file storage and add file link to work package** +The generated PDF is stored in an external file storage, and a link to the file is added to the artifact work package. +> [!NOTE] +> This option requires a configured file storage with automatically managed project folders. At the moment, only **Nextcloud** file storages are supported. If no suitable external file storage is configured for the project, this option is unavailable. + +Click **Save** to apply your selection. + +## Disable project initiation request + +To stop using this project as a template for the project initiation flow, click **Disable** in the top right corner. + +![Button to disable project initiation request in OpenProject project settings](openproject_userguide_project_settings_pir_request_disable.png) \ No newline at end of file diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_artifact_export.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_artifact_export.png new file mode 100644 index 00000000000..282b42f2389 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_artifact_export.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_attributes.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_attributes.png new file mode 100644 index 00000000000..d9e8b33db18 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_attributes.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_disable.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_disable.png new file mode 100644 index 00000000000..30876d1d73c Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_disable.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_name.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_name.png new file mode 100644 index 00000000000..dac80728177 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_name.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_not_initiated.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_not_initiated.png new file mode 100644 index 00000000000..b52e2f4b057 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_not_initiated.png differ diff --git a/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_submission.png b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_submission.png new file mode 100644 index 00000000000..5ec70f685e8 Binary files /dev/null and b/docs/user-guide/projects/project-initiation-request/project-initiation-request-settings/openproject_userguide_project_settings_pir_request_submission.png differ diff --git a/docs/user-guide/work-packages/add-work-packages-to-meetings/README.md b/docs/user-guide/work-packages/add-work-packages-to-meetings/README.md index e4af53f2382..4944ccc89fc 100644 --- a/docs/user-guide/work-packages/add-work-packages-to-meetings/README.md +++ b/docs/user-guide/work-packages/add-work-packages-to-meetings/README.md @@ -3,14 +3,19 @@ sidebar_navigation: title: Add work packages to meetings priority: 965 description: How to add work packages to meetings agenda. -keywords: meetings, dynamic meetings, meeting agenda +keywords: meetings, dynamic meetings, meeting agenda, one-time meeting, meeting outcomes, work package outcomes, follow-up task --- # Add work packages to meetings Meetings and work packages can be linked to one another in OpenProject. This can be done either from the detailed view of a work package or when editing [a one-time or a recurring meeting](../../meetings/one-time-meetings/#add-a-work-package-to-the-agenda). -To add a work package to a meeting, open the detailed view of that work package, select the **Meetings** tab and click the **+Add to meeting** button. +You can link work packages to meetings in two ways: + +- Add a work package as an **agenda item** (to discuss it during the meeting). +- Add a work package as a **meeting outcome** (to document a follow-up task created or agreed on during the meeting). + +To add a work package to a meeting agenda, open the detailed view of that work package, select the **Meetings** tab and click the **+Add to meeting** button. ![Add a work package to a meeting in OpenProject](openproject_user_guide_add_wp_to_meeting.png) @@ -20,14 +25,29 @@ To add a work package to a meeting, open the detailed view of that work package, In the dialog that appears, select a meeting from the list of upcoming meetings. Once a meeting is selected, you can add the work package to a specific meeting section or to the backlog. If no sections have been created for the meeting yet, you can add the work package to the meeting or meeting series backlog (for a one-time meeting, this happens automatically). -You can also add any relevant notes (like discussion points, open questions or decision need). Click **Save** to add a new work package to the selected meeting as an agenda item. +You can also add any relevant notes (like discussion points, open questions or decisions needed). Click **Save** to add a new work package to the selected meeting as an agenda item. ![Add a work package to a new meeting](openproject_user_guide_meeting_dialogue.png) The newly-created work package agenda item can be [re-ordered and edited](../../meetings/one-time-meetings/#edit-a-meeting). +## Add a work package as a meeting outcome + +In addition to adding work packages to the agenda before a meeting, you can also [add work packages as **meeting outcomes**](../../meetings/one-time-meetings/#meeting-outcomes). This is useful to create follow-up tasks during a meeting and keep them connected to the meeting and agenda item. + +To add a work package as an outcome, the meeting status has to first be set to **In progress**. You can then click **+ Outcome** at the end of an agenda item and select either: + +- **Existing work package** to link an already existing work package, or +- **New work package** to create a new work package directly from the meeting. + +Work packages that were added as outcomes are shown in the **Meetings** tab of the work package with an **Added as outcome** label. + +![Agenda item outcomes displayed in Meetings tab in a work package in OpenProject](openproject_userguide_meetings_agenda_outcome_in_work_package.png) + ## View existing linked meetings The **Meetings** tab will also list all meetings, past and upcoming, to which the current work package has already been linked to. -Each linked meeting will also also include any notes associated with that work package agenda item. This can be useful to recall specific discussion points, open questions or decisions taken during a meeting that concerns the current work package. +Each linked meeting will also include any notes associated with that work package agenda item. This can be useful to recall specific discussion points, open questions or decisions taken during a meeting that concerns the current work package. + +![Work package in OpenProject showing a Meetings tab, which displays a meeting in which this work package was referenced](openproject_user_guide_work_packages_meetings_tab.png) diff --git a/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_user_guide_work_packages_meetings_tab.png b/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_user_guide_work_packages_meetings_tab.png new file mode 100644 index 00000000000..0d720e30b25 Binary files /dev/null and b/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_user_guide_work_packages_meetings_tab.png differ diff --git a/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png b/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png new file mode 100644 index 00000000000..d7b8a8aece4 Binary files /dev/null and b/docs/user-guide/work-packages/add-work-packages-to-meetings/openproject_userguide_meetings_agenda_outcome_in_work_package.png differ diff --git a/docs/user-guide/work-packages/work-package-table-configuration/README.md b/docs/user-guide/work-packages/work-package-table-configuration/README.md index ceaeafea8ef..1b9383aafaa 100644 --- a/docs/user-guide/work-packages/work-package-table-configuration/README.md +++ b/docs/user-guide/work-packages/work-package-table-configuration/README.md @@ -14,7 +14,7 @@ keywords: work packages table configuration, work package table, columns, filter | [Filter work packages](#filter-work-packages) | How to filter in the work package table. | | [Sort the work package table](#sort-the-work-package-table) | How to sort within the work package table. | | [Display settings](#flat-list-hierarchy-mode-and-group-by) | Get to know the flat list, the hierarchy mode, the group by and the sum feature. | -| [Attribute highlighting (Enterprise add-on)](#attribute-highlighting-enterprise-add-on) | How to highlight certain attributes in the work package table. | +| [Attribute highlighting](#attribute-highlighting) | How to highlight certain attributes in the work package table. | | [Save work package views](#save-work-package-views) | How to save a new work package view and how to change existing ones. | You can configure the work package table view in OpenProject to display the information you need in the table. @@ -233,9 +233,7 @@ If you group the work package table, sums will be shown for each group. ![Example of sums for Work, Remaining work and % Complete shown in a work package table in OpenProject](openproject_user_guide_wp_table_display_sums.png) -## Attribute highlighting (Enterprise add-on) - -[feature: conditional_highlighting ] +## Attribute highlighting You can highlight attributes in the work package table to emphasize the importance of certain attributes and have important topics at a glance. To activate attribute highlighting open the work package configuration table and select the **Highlighting** tab. diff --git a/frontend/.gitignore b/frontend/.gitignore index d7ea731ad84..f5a6762a0a9 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,5 +1,6 @@ /.angular/cache /.sass-cache +/stats.html /bower_components /coverage /node_modules diff --git a/frontend/angular.json b/frontend/angular.json index 1553a13847b..ca103122a9e 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -71,8 +71,7 @@ "silenceDeprecations": [ "color-functions", "global-builtin", - "import", - "mixed-decls" + "import" ] } }, @@ -81,6 +80,11 @@ "input": "node_modules/jquery/dist/jquery.min.js", "inject": false, "bundleName": "jquery" + }, + { + "input": "node_modules/openapi-explorer/dist/browser/openapi-explorer.min.js", + "inject": false, + "bundleName": "openapi-explorer" } ] }, diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 6516882b6e4..8c9e8b67404 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -146,6 +146,10 @@ export default defineConfig([ ...angular.configs.templateAccessibility, ], rules: { + '@angular-eslint/template/click-events-have-key-events': [ + 'error', + { 'ignoreWithDirectives': ['uiSref'] } + ], '@angular-eslint/template/elements-content': [ 'error', { 'allowList': ['textContent'] } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e9ff0b47246..350650c3c64 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,18 +9,18 @@ "version": "0.1.0", "license": "GPLv3", "dependencies": { - "@angular/animations": "^20.3.14", - "@angular/cdk": "^20.2.14", - "@angular/cli": "^20.3.12", - "@angular/common": "^20.3.14", - "@angular/compiler": "^20.3.15", - "@angular/compiler-cli": "^20.3.14", - "@angular/core": "^20.3.14", - "@angular/elements": "^20.3.14", - "@angular/forms": "^20.3.14", - "@angular/platform-browser": "^20.3.14", - "@angular/platform-browser-dynamic": "^20.3.14", - "@angular/router": "^20.3.14", + "@angular/animations": "^21.1.1", + "@angular/cdk": "^21.1.1", + "@angular/cli": "^21.1.1", + "@angular/common": "^21.1.1", + "@angular/compiler": "^21.1.1", + "@angular/compiler-cli": "^21.1.1", + "@angular/core": "^21.1.1", + "@angular/elements": "^21.1.1", + "@angular/forms": "^21.1.1", + "@angular/platform-browser": "^21.1.1", + "@angular/platform-browser-dynamic": "^21.1.1", + "@angular/router": "^21.1.1", "@appsignal/javascript": "^1.6.1", "@appsignal/plugin-breadcrumbs-console": "^1.1.37", "@appsignal/plugin-breadcrumbs-network": "^1.1.24", @@ -30,63 +30,62 @@ "@braintree/sanitize-url": "^7.1.1", "@datorama/akita": "^8.0.1", "@floating-ui/dom": "^1.2.1", - "@fullcalendar/angular": "^6.1.10", + "@fullcalendar/angular": "^6.1.20", "@fullcalendar/common": "^5.11.5", - "@fullcalendar/core": "^6.1.11", - "@fullcalendar/daygrid": "^6.1.11", - "@fullcalendar/interaction": "^6.1.11", - "@fullcalendar/list": "^6.1.11", - "@fullcalendar/moment": "^6.1.17", - "@fullcalendar/moment-timezone": "^6.1.17", - "@fullcalendar/resource": "^6.1.11", + "@fullcalendar/core": "^6.1.20", + "@fullcalendar/daygrid": "^6.1.20", + "@fullcalendar/interaction": "^6.1.20", + "@fullcalendar/list": "^6.1.20", + "@fullcalendar/moment": "^6.1.20", + "@fullcalendar/moment-timezone": "^6.1.20", + "@fullcalendar/resource": "^6.1.20", "@fullcalendar/resource-common": "^5.11.5", - "@fullcalendar/resource-timeline": "^6.1.11", - "@fullcalendar/timegrid": "^6.1.11", + "@fullcalendar/resource-timeline": "^6.1.20", + "@fullcalendar/timegrid": "^6.1.20", "@github/webauthn-json": "^2.1.1", - "@hocuspocus/provider": "^3.4.0", + "@hocuspocus/provider": "^3.4.4", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo": "^8.0.20", "@hotwired/turbo-rails": "^8.0.20", - "@knowledgecode/delegate": "^0.8.5", + "@knowledgecode/delegate": "^0.10.0", "@kolkov/ngx-gallery": "^2.0.1", - "@mantine/core": "^8.3.7", + "@mantine/core": "^8.3.10", "@mantine/hooks": "^8.3.6", "@mantine/utils": "^6.0.22", "@ng-select/ng-option-highlight": "^20.6.3", "@ng-select/ng-select": "^20.1.0", "@ngneat/content-loader": "^7.0.0", "@openproject/octicons-angular": "^19.32.0", - "@openproject/primer-view-components": "^0.79.1", + "@openproject/primer-view-components": "^0.80.2", "@openproject/reactivestates": "^3.0.1", - "@primer/css": "^22.0.2", + "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.3.1", - "@primer/view-components": "npm:@openproject/primer-view-components@^0.79.1", - "@rails/request.js": "^0.0.12", + "@primer/primitives": "^11.3.2", + "@primer/view-components": "npm:@openproject/primer-view-components@^0.80.2", + "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", "@stimulus-components/reveal": "^5.0.0", - "@tiptap/extensions": "^3.11.0", - "@types/hotwired__turbo": "^8.0.1", + "@tiptap/extensions": "^3.13.0", "@types/jquery.cookie": "^1.4.36", "@uirouter/angular": "^17.0.0", "@uirouter/core": "^6.1.0", "@uirouter/rx": "^1.0.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.7.1", - "autoprefixer": "^10.4.22", + "autoprefixer": "^10.4.23", "byte-base64": "^1.1.0", "chart.js": "4.5.1", "chartjs-plugin-datalabels": "^2.2.0", "codemirror": "^5.62.0", "copy-text-to-clipboard": "^3.2.2", - "core-js": "^3.46.0", + "core-js": "^3.47.0", "crossvent": "^1.5.4", "dom-autoscroller": "^2.2.8", "dom-plane": "^1.0.2", "dragula": "^3.7.3", "es6-slide-up-down": "^1.0.0", "flatpickr": "^4.6.13", - "glob": "^12.0.0", + "glob": "^13.0.0", "hammerjs": "^2.0.8", "i18n-js": "^4.3.0", "idiomorph": "^0.7.4", @@ -95,8 +94,8 @@ "jquery.cookie": "^1.4.1", "jquery.flot": "^0.8.3", "json5": "^2.2.2", - "lit-html": "^3.3.1", - "lodash": "^4.17.21", + "lit-html": "^3.3.2", + "lodash": "^4.17.23", "mark.js": "^8.11.0", "mdx-embed": "^1.1.2", "mime": "^4.1.0", @@ -106,13 +105,14 @@ "ng-dynamic-component": "^10.7.0", "ng2-charts": "^8.0.0", "ng2-dragula": "^6.0.0", - "ngx-cookie-service": "^20.1.1", + "ngx-cookie-service": "^21.1.0", "observable-array": "0.0.4", "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.0.22/op-blocknote-extensions-0.0.22.tgz", + "openapi-explorer": "^2.4.788", "pako": "^2.0.3", "qr-creator": "^1.0.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.0", "screenfull": "^6.0.2", @@ -128,49 +128,50 @@ "zone.js": "~0.15.1" }, "devDependencies": { - "@angular-builders/custom-esbuild": "^20.0.0", - "@angular-devkit/build-angular": "^20.3.12", + "@angular-builders/custom-esbuild": "^21.0.3", + "@angular-devkit/build-angular": "^21.1.1", "@angular-eslint/builder": "20.7.0", "@angular-eslint/eslint-plugin": "20.7.0", "@angular-eslint/eslint-plugin-template": "20.7.0", "@angular-eslint/schematics": "20.7.0", "@angular-eslint/template-parser": "20.7.0", - "@angular/language-service": "20.3.14", - "@eslint/js": "^9.39.1", - "@html-eslint/eslint-plugin": "^0.49.0", - "@html-eslint/parser": "^0.49.0", + "@angular/language-service": "21.1.1", + "@eslint/js": "^9.39.2", + "@html-eslint/eslint-plugin": "^0.54.0", + "@html-eslint/parser": "^0.54.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@stylistic/eslint-plugin": "^5.5.0", + "@stylistic/eslint-plugin": "^5.6.1", "@types/codemirror": "5.60.5", "@types/dom-navigation": "^1.0.3", "@types/dragula": "^3.7.5", "@types/flot": "^0.0.36", "@types/hammerjs": "^2.0.36", - "@types/jasmine": "~5.1.12", + "@types/hotwired__turbo": "^8.0.5", + "@types/jasmine": "~6.0.0", "@types/jquery": "^3.5.33", "@types/jqueryui": "^1.12.24", - "@types/lodash": "^4.17.21", + "@types/lodash": "^4.17.23", "@types/mousetrap": "^1.6.3", "@types/pako": "^2.0.4", "@types/rails__request.js": "^0.0.1", - "@types/react": "^19.2.7", + "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", "@types/resize-observer-browser": "^0.1.4", "@types/urijs": "^1.19.26", "@types/uuid": "^11.0.0", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "8.46.3", - "@typescript-eslint/parser": "8.46.2", - "angular-eslint": "^20.5.1", - "browserslist": "^4.27.0", - "eslint": "^9.39.1", + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.52.0", + "angular-eslint": "^21.1.0", + "browserslist": "^4.28.1", + "eslint": "^9.39.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", - "globals": "^16.5.0", - "jasmine-core": "~5.12.1", + "globals": "^17.0.0", + "jasmine-core": "~6.0.1", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", @@ -181,200 +182,204 @@ "karma-spec-reporter": "^0.0.36", "source-map-explorer": "^2.5.2", "ts-node": "~10.9.2", - "typescript": "^5.8.3", - "typescript-eslint": "^8.46.2", - "webpack-bundle-analyzer": "^4.4.2", + "typescript": "^5.9.3", + "typescript-eslint": "^8.54.0", "wscat": "^6.1.0" }, "optionalDependencies": { "fsevents": "*" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@algolia/abtesting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", - "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.2.tgz", + "integrity": "sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", - "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.2.tgz", + "integrity": "sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", - "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.2.tgz", + "integrity": "sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", - "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.2.tgz", + "integrity": "sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==", + "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", - "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.2.tgz", + "integrity": "sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", - "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.2.tgz", + "integrity": "sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", - "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.2.tgz", + "integrity": "sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", - "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.2.tgz", + "integrity": "sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", - "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.2.tgz", + "integrity": "sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", - "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.2.tgz", + "integrity": "sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", - "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.2.tgz", + "integrity": "sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", - "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.2.tgz", + "integrity": "sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", - "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.2.tgz", + "integrity": "sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", - "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.2.tgz", + "integrity": "sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" @@ -384,6 +389,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -394,13 +400,13 @@ } }, "node_modules/@angular-builders/common": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-4.0.0.tgz", - "integrity": "sha512-bepZI1KdXUVhDGqHOudZQJwucSbZWxfWzM+EHFXUoExUO0u7XEuHTF5bhtQZ+YU+ZK2Ayl26QbI/26Yj72vcFQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-5.0.3.tgz", + "integrity": "sha512-Dro3574mu4/xqmjdA3159+TXDhgTbIJpEY/iBETSKUvHJiCgHel+R3eT105RpHN5o7NaD2rau5Zk2wuZqOk35Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "^20.0.0", + "@angular-devkit/core": "^21.0.0", "ts-node": "^10.0.0", "tsconfig-paths": "^4.2.0" }, @@ -408,31 +414,171 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@angular-builders/custom-esbuild": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/custom-esbuild/-/custom-esbuild-20.0.0.tgz", - "integrity": "sha512-ZFROfAiDPM+mvZQDCO7iP/0L9kZriMr9gPzs57WbME0KJIMjhcMnfRxOSx0uDwbwzt8lCTamv/nUvN1eW1d2bw==", + "node_modules/@angular-builders/common/node_modules/@angular-devkit/core": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.0.tgz", + "integrity": "sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-builders/common": "4.0.0", - "@angular-devkit/architect": ">=0.2000.0 < 0.2100.0", - "@angular-devkit/core": "^20.0.0", - "@angular/build": "^20.0.0" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-builders/common/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-builders/common/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-builders/custom-esbuild": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-esbuild/-/custom-esbuild-21.0.3.tgz", + "integrity": "sha512-Q56JTNVrmdm2XJEHu3HWsTcxXMREYZ2ROnuaUs7ZV02Tu8E9Y8ejk8LCsRFNe/LKciUUMzaM6B78nSkXrkkNjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-builders/common": "5.0.3", + "@angular-devkit/architect": ">=0.2100.0 < 0.2200.0", + "@angular-devkit/core": "^21.0.0", + "@angular/build": "^21.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler-cli": "^20.0.0" + "@angular/compiler-cli": "^21.0.0", + "vitest": ">=2" + } + }, + "node_modules/@angular-builders/custom-esbuild/node_modules/@angular-devkit/architect": { + "version": "0.2101.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.0.tgz", + "integrity": "sha512-vnNAzWXwSRGTHk2K7woIQsj7WDYZp69Z3DBdlxkK0H08ymkJ/ELbhN0/AnIJNNtYCqEb57AH7Ro98n422beDuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.1.0", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-builders/custom-esbuild/node_modules/@angular-devkit/core": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.0.tgz", + "integrity": "sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-builders/custom-esbuild/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-builders/custom-esbuild/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@angular-devkit/architect": { - "version": "0.2003.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.12.tgz", - "integrity": "sha512-5H40lAFF4CKY32C4HOp6bTlOF1f4WsGCwe7FjFQp9A+T7yoCBiHpIWt2JKTwV4sBoTKVDZOnuf0GG+UVKjQT4A==", + "version": "0.2003.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.14.tgz", + "integrity": "sha512-dVlWqaYu0PIgHTBu16uYUS6lJOIpXCpOYhPWuYwqdo7a4x2HcagPQ+omUZJTA6kukh7ROpKcRoiy/DsO/DgvUA==", + "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.12", + "@angular-devkit/core": "20.3.14", "rxjs": "7.8.2" }, "engines": { @@ -441,63 +587,122 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.14.tgz", + "integrity": "sha512-hWQVi73aGdIRInJqNia79Yi6SzqEThkfLug3AdZiNuNvYMaxAI347yPQz4f3Dr/i0QuiqRq/T8zfqbr46tfCqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/build-angular": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.12.tgz", - "integrity": "sha512-HPepPbJA5vprYTWJaSCfpk0s1bPT6Ui6VjFOSb9oY+p9iq+MGkuB1I+swNcRcMLttyMD+FpbMd27F8jSeX5XVw==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.1.tgz", + "integrity": "sha512-h882zE4NpfXQIzCKq6cXq4FBTd43rLCLX5RZL/sa38cFVNDp51HNn+rU9l4PeXQOKllq4CVmj9ePgVecyMpr2Q==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.12", - "@angular-devkit/build-webpack": "0.2003.12", - "@angular-devkit/core": "20.3.12", - "@angular/build": "20.3.12", - "@babel/core": "7.28.3", - "@babel/generator": "7.28.3", + "@angular-devkit/architect": "0.2101.1", + "@angular-devkit/build-webpack": "0.2101.1", + "@angular-devkit/core": "21.1.1", + "@angular/build": "21.1.1", + "@babel/core": "7.28.5", + "@babel/generator": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-transform-async-generator-functions": "7.28.0", "@babel/plugin-transform-async-to-generator": "7.27.1", - "@babel/plugin-transform-runtime": "7.28.3", - "@babel/preset-env": "7.28.3", - "@babel/runtime": "7.28.3", + "@babel/plugin-transform-runtime": "7.28.5", + "@babel/preset-env": "7.28.5", + "@babel/runtime": "7.28.4", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.3.12", + "@ngtools/webpack": "21.1.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.21", + "autoprefixer": "10.4.23", "babel-loader": "10.0.0", - "browserslist": "^4.21.5", + "browserslist": "^4.26.0", "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.9", - "fast-glob": "3.3.3", + "esbuild-wasm": "0.27.2", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.4.0", + "less": "4.4.2", "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", "mini-css-extract-plugin": "2.9.4", - "open": "10.2.0", - "ora": "8.2.0", + "open": "11.0.0", + "ora": "9.0.0", "picomatch": "4.0.3", - "piscina": "5.1.3", + "piscina": "5.1.4", "postcss": "8.5.6", - "postcss-loader": "8.1.1", + "postcss-loader": "8.2.0", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.90.0", - "sass-loader": "16.0.5", - "semver": "7.7.2", + "sass": "1.97.1", + "sass-loader": "16.0.6", + "semver": "7.7.3", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.43.1", + "terser": "5.44.1", + "tinyglobby": "0.2.15", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.101.2", - "webpack-dev-middleware": "7.4.2", + "webpack": "5.104.1", + "webpack-dev-middleware": "7.4.5", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" @@ -508,25 +713,25 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.9" + "esbuild": "0.27.2" }, "peerDependencies": { - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.12", + "@angular/compiler-cli": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/localize": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/service-worker": "^21.0.0", + "@angular/ssr": "^21.1.1", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^29.5.0 || ^30.2.0", - "jest-environment-jsdom": "^29.5.0 || ^30.2.0", + "jest": "^30.2.0", + "jest-environment-jsdom": "^30.2.0", "karma": "^6.3.0", - "ng-packagr": "^20.0.0", + "ng-packagr": "^21.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.8 <6.0" + "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -573,6 +778,51 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -582,54 +832,76 @@ "node": ">=14.17.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "ajv": "^8.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { @@ -648,6 +920,68 @@ "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -660,13 +994,63 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2003.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.12.tgz", - "integrity": "sha512-IkhCU0nAsXYBQOfHu2gQBcYBKhaV1c8wYtu7MmelBcN/iUrG8hRf1sZx+ppUgsdZuBYxCiDiLpcfRVRCIASkvw==", + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.1.tgz", + "integrity": "sha512-gX5/4RT/1ZO6kyo6bEi8uSxZ5oqdolsi87PchKRJfFir2m8u101qs3H07o4KFgG4YlnPUwyHET3ae5YVhS/0xg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.2003.12", + "@angular-devkit/architect": "0.2101.1", "rxjs": "7.8.2" }, "engines": { @@ -679,10 +1063,85 @@ "webpack-dev-server": "^5.0.2" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/core": { "version": "20.3.12", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.12.tgz", "integrity": "sha512-ReFxd/UOoVDr3+kIUjmYILQZF89qg62POdY7a7OqBH7plmInFlYVSEDouJvGqj3LVCPiqTk2ZOSChbhS/eLxXA==", + "dev": true, "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -709,6 +1168,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -726,6 +1186,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, "engines": { "node": ">=12" }, @@ -737,6 +1198,7 @@ "version": "20.3.12", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.12.tgz", "integrity": "sha512-JqJ1u59y+Ud51k/8MHYzSP+aQOeC2PJBaDmMnvqfWVaIt6n3x4gc/VtuhqhpJ0SKulbFuOWgAfI6QbPFrgUYQQ==", + "dev": true, "dependencies": { "@angular-devkit/core": "20.3.12", "jsonc-parser": "3.3.1", @@ -857,18 +1319,6 @@ "node": ">= 4" } }, - "node_modules/@angular-eslint/schematics/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular-eslint/template-parser": { "version": "20.7.0", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.7.0.tgz", @@ -899,10 +1349,32 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@angular-eslint/utils": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.1.0.tgz", + "integrity": "sha512-rWINgxGREu+NFUPCpAVsBGG8B4hfXxyswM0N5GbjykvsfB5W6PUix2Gsoh++iEsZPT+c9lvgXL5GbpwfanjOow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.1.0.tgz", + "integrity": "sha512-t52J6FszgEHaJ+IjuzU9qaWfVxsjlVNkAP+B5z2t4NDgbbDDsmI+QJh0OtP1qdlqzjh2pbocEml30KhYmNZm/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@angular/animations": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.14.tgz", - "integrity": "sha512-Sx3/XNu2rR+R8T8JkJEaIpZDZPk0IecS0Ayt6HTanNUZXuw0HVou3vkjR5B2St5nM4MXs0gh+S6aLNuArtqJTQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.1.tgz", + "integrity": "sha512-OQRyNbFBCkuihdCegrpN/Np5YQ7uV9if48LAoXxT68tYhK3S/Qbyx2MzJpOMFEFNfpjXRg1BZr8hVcZVFnArpg==", "dependencies": { "tslib": "^2.3.0" }, @@ -910,41 +1382,42 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.14" + "@angular/core": "21.1.1" } }, "node_modules/@angular/build": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.12.tgz", - "integrity": "sha512-iAZve4VPviC8y6RFctyh3qFXSlP5mth9K46/0zasB4LV4pcmu8BrzIHERxIn/jCDNdVdPh973kxo1ksO4WpyuA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.1.tgz", + "integrity": "sha512-OqlfH7tkahw/lFT6ACU6mqt3AGgTxxT27JTqpzZOeGo1ferR9dq1O6/CT4GiNyr/Z1AMfs7rBWlQH68y1QZb2g==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.12", - "@babel/core": "7.28.3", + "@angular-devkit/architect": "0.2101.1", + "@babel/core": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.14", + "@inquirer/confirm": "5.1.21", "@vitejs/plugin-basic-ssl": "2.1.0", "beasties": "0.3.5", - "browserslist": "^4.23.0", - "esbuild": "0.25.9", + "browserslist": "^4.26.0", + "esbuild": "0.27.2", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", - "listr2": "9.0.1", - "magic-string": "0.30.17", + "listr2": "9.0.5", + "magic-string": "0.30.21", "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.0", "picomatch": "4.0.3", - "piscina": "5.1.3", - "rollup": "4.52.3", - "sass": "1.90.0", - "semver": "7.7.2", + "piscina": "5.1.4", + "rolldown": "1.0.0-beta.58", + "sass": "1.97.1", + "semver": "7.7.3", "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.1.11", - "watchpack": "2.4.4" + "tinyglobby": "0.2.15", + "undici": "7.18.2", + "vite": "7.3.0", + "watchpack": "2.5.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -952,25 +1425,25 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.4.2" + "lmdb": "3.4.4" }, "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.12", + "@angular/compiler": "^21.0.0", + "@angular/compiler-cli": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/localize": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/service-worker": "^21.0.0", + "@angular/ssr": "^21.1.1", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^20.0.0", + "ng-packagr": "^21.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.8 <6.0", - "vitest": "^3.1.1" + "typescript": ">=5.9 <6.0", + "vitest": "^4.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -1011,6 +1484,68 @@ } } }, + "node_modules/@angular/build/node_modules/@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/build/node_modules/@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@angular/build/node_modules/istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", @@ -1028,14 +1563,14 @@ "node": ">=10" } }, - "node_modules/@angular/build/node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "node_modules/@angular/build/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/@angular/build/node_modules/picomatch": { @@ -1051,16 +1586,17 @@ } }, "node_modules/@angular/cdk": { - "version": "20.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", - "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.1.tgz", + "integrity": "sha512-lzscv+A6FCQdyWIr0t0QHXEgkLzS9wJwgeOOOhtxbixxxuk7xVXdcK/jnswE1Maugh1m696jUkOhZpffks3psA==", "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1089,28 +1625,29 @@ } }, "node_modules/@angular/cli": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.12.tgz", - "integrity": "sha512-vqVyVjbFPCRMjA5evL7tV2JeR6Anuzb9WcXTMB17fr7uzKNNAvo7KyRaOJjp+TU4JDARTNyGPy0aywfPx7R60A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.1.tgz", + "integrity": "sha512-eXhHuYvruWHBn7lX3GuAyLq29+ELwPADOW8ShzZkWRPNlIDiFDsS5pXrxkM9ez+8f86kfDHh88Twevn4UBUqQg==", "dependencies": { - "@angular-devkit/architect": "0.2003.12", - "@angular-devkit/core": "20.3.12", - "@angular-devkit/schematics": "20.3.12", - "@inquirer/prompts": "7.8.2", - "@listr2/prompt-adapter-inquirer": "3.0.1", - "@modelcontextprotocol/sdk": "1.17.3", - "@schematics/angular": "20.3.12", + "@angular-devkit/architect": "0.2101.1", + "@angular-devkit/core": "21.1.1", + "@angular-devkit/schematics": "21.1.1", + "@inquirer/prompts": "7.10.1", + "@listr2/prompt-adapter-inquirer": "3.0.5", + "@modelcontextprotocol/sdk": "1.25.2", + "@schematics/angular": "21.1.1", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.35.0", - "ini": "5.0.0", + "algoliasearch": "5.46.2", + "ini": "6.0.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.1", - "npm-package-arg": "13.0.0", - "pacote": "21.0.0", - "resolve": "1.22.10", - "semver": "7.7.2", + "listr2": "9.0.5", + "npm-package-arg": "13.0.2", + "pacote": "21.0.4", + "parse5-html-rewriting-stream": "8.0.0", + "resolve": "1.22.11", + "semver": "7.7.3", "yargs": "18.0.0", - "zod": "3.25.76" + "zod": "4.3.5" }, "bin": { "ng": "bin/ng.js" @@ -1121,6 +1658,82 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dependencies": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.1.tgz", + "integrity": "sha512-3ptEOuALghEYEPVbhRa7g8a+YmvmHqHVNqF9XqCbG22nPGWkE58qfNNbXi3tF9iQxzKSGw5Iy5gYUvSvpsdcfw==", + "dependencies": { + "@angular-devkit/core": "21.1.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.0.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@angular/cli/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -1145,6 +1758,28 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@angular/cli/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular/cli/node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", @@ -1165,37 +1800,75 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "license": "MIT" }, - "node_modules/@angular/cli/node_modules/hosted-git-info": { + "node_modules/@angular/cli/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@angular/cli/node_modules/ora": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", - "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", "dependencies": { - "lru-cache": "^11.1.0" + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", - "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "node_modules/@angular/cli/node_modules/ora/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@angular/cli/node_modules/string-width": { @@ -1216,9 +1889,9 @@ } }, "node_modules/@angular/cli/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -1274,9 +1947,9 @@ } }, "node_modules/@angular/common": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.14.tgz", - "integrity": "sha512-OOUvjTtnpktJLsNupA+GFT2q5zNocPdpOENA8aSrXvAheNybLjgi+otO3U3sQsvB1VwaoEZ9GT5O3lZlstnA/A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.1.tgz", + "integrity": "sha512-Di2I6TooHdKun3SqRr45o4LbWJq/ZdwUt3fg0X3obPYaP/f6TrFQ4TMjcl03EfPufPtoQx6O+d32rcWVLhDxyw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1284,14 +1957,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.14", + "@angular/core": "21.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.15.tgz", - "integrity": "sha512-lMicIAFAKZXa+BCZWs3soTjNQPZZXrF/WMVDinm8dQcggNarnDj4UmXgKSyXkkyqK5SLfnLsXVzrX6ndVT6z7A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.1.tgz", + "integrity": "sha512-Urd3bh0zv0MQ//S7RRTanIkOMAZH/A7vSMXUDJ3aflplNs7JNbVqBwDNj8NoX1V+os+fd8JRJOReCc1EpH4ZKQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1300,13 +1973,13 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.14.tgz", - "integrity": "sha512-lFg9ikwRClzDPjdFiwynbVFIi1RJZf/0i+OHa3Ns2gzXxJeHNKMJrHHjWZ2DU4N2UpxH0YAPe22N9Bie28IuQQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.1.tgz", + "integrity": "sha512-CCB8SZS0BzqLOdOaMpPpOW256msuatYCFDRTaT+awYIY1vQp/eLXzkMTD2uqyHraQy8cReeH/P6optRP9A077Q==", "dependencies": { - "@babel/core": "7.28.3", + "@babel/core": "7.28.5", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", @@ -1321,8 +1994,8 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.14", - "typescript": ">=5.8 <6.0" + "@angular/compiler": "21.1.1", + "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { "typescript": { @@ -1355,14 +2028,15 @@ } }, "node_modules/@angular/compiler-cli/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1389,11 +2063,12 @@ "license": "MIT" }, "node_modules/@angular/compiler-cli/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -1476,9 +2151,9 @@ } }, "node_modules/@angular/core": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.14.tgz", - "integrity": "sha512-rpyEbhWF6Fj/xI9IvNLZh5QBUYnoXuF7vX54CCtyQ2MHALxRR/aa1WRxjRM96cF2OqodQ/Gj3oYW8ei8hlBh4w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.1.tgz", + "integrity": "sha512-KFRCEhsi02pY1EqJ5rnze4mzSaacqh14D8goDhtmARiUH0tefaHR+uKyu4bKSrWga2T/ExG0DJX52LhHRs2qSw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1486,9 +2161,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.14", + "@angular/compiler": "21.1.1", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" + "zone.js": "~0.15.0 || ~0.16.0" }, "peerDependenciesMeta": { "@angular/compiler": { @@ -1500,9 +2175,9 @@ } }, "node_modules/@angular/elements": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-20.3.14.tgz", - "integrity": "sha512-zJQn5LaWoAsyL5NT2o4PxiRZLi5oESFkbw5yRQMLw3CDhdFARLDDQtPwwieujuTZ2UNWni4RwBmkvDVXKmVM4A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.1.tgz", + "integrity": "sha512-2ROobfnYWxAZlDKB3lYdo6V7utX96d43HRX3hU0BG5T6gglBwNnvDGClpmxOqwtP/uhf1fk+BVSSsjtiUWX3vg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1510,40 +2185,41 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.14", + "@angular/core": "21.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.14.tgz", - "integrity": "sha512-fGrJ589tU+AKoxf+kaRrEw7wlSfVr1/z/Fz625ggFCc6ySQEityKW3JsnLfNkh5qGrdxib4BOfF78f9J7Pyk+w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.1.tgz", + "integrity": "sha512-NBbJOynLOeMsPo03+3dfdxE0P7SB7SXRqoFJ7WP2sOgOIxODna/huo2blmRlnZAVPTn1iQEB9Q+UeyP5c4/1+w==", "dependencies": { + "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.14", - "@angular/core": "20.3.14", - "@angular/platform-browser": "20.3.14", + "@angular/common": "21.1.1", + "@angular/core": "21.1.1", + "@angular/platform-browser": "21.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.3.14.tgz", - "integrity": "sha512-3Jvi60WzLUe6jQJEw1xi/35uW7ynzxOS7iyZlwYfl2v8RljeLyyQsm0WNVpq6tXt80ppDeD59JvYTguEQ283Og==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.1.tgz", + "integrity": "sha512-Nniqe8X5mTIm37u46HDXCEDuYIv+G5nJZuz1BwuSyDgqxCmdJ3asdgkxgkRQW8NUjXmj6/2vWJ3gn/by4VcKEA==", "dev": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.14.tgz", - "integrity": "sha512-Lviz9GfsIyOIBDal8QhIBKU8OMH29A0RhFw2opTC50sqKadXLN9CD7iSaAwQbNLc4mc3JAF4zth0AzKdHLbz7Q==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.1.tgz", + "integrity": "sha512-d6liZjPz29GUZ6dhxytFL/W2nMsYwPpc/E/vZpr5yV+u+gI2VjbnLbl8SG+jjj0/Hyq7s4aGhEKsRrCJJMXgNw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1551,9 +2227,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.3.14", - "@angular/common": "20.3.14", - "@angular/core": "20.3.14" + "@angular/animations": "21.1.1", + "@angular/common": "21.1.1", + "@angular/core": "21.1.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1562,9 +2238,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.14.tgz", - "integrity": "sha512-g9z/g8gIOrBCX1SQ/GWwB0+JXBC6CKe0+yRyy9GGeBLm/YXWZHxTkmnDmueXXfPtUl8TOAInE22wlLcfunWTrg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.1.tgz", + "integrity": "sha512-lawT3bdjXZVmVNXVoPS0UiB8Qxw5jEYXHx2m38JvHGv7/pl0Sgr+wa6f+/4pvTwu3VZb/8ohkVdFicPfrU21Jw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1572,16 +2248,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.14", - "@angular/compiler": "20.3.14", - "@angular/core": "20.3.14", - "@angular/platform-browser": "20.3.14" + "@angular/common": "21.1.1", + "@angular/compiler": "21.1.1", + "@angular/core": "21.1.1", + "@angular/platform-browser": "21.1.1" } }, "node_modules/@angular/router": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.14.tgz", - "integrity": "sha512-gi7/NuHRS9n9RCwh03VuVFizVMa2lKL/s+7yP3Ecq2nQ5uSeTMWb/91OmGEBwncI3wKPkYdQ9g3n6PvK/O8uDQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.1.tgz", + "integrity": "sha512-3ypbtH3KfzuVgebdEET9+bRwn1VzP//KI0tIqleCGi4rblP3WQ/HwIGa5Qhdcxmw/kbmABKLRXX2kRUvidKs/Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -1589,12 +2265,24 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.14", - "@angular/core": "20.3.14", - "@angular/platform-browser": "20.3.14", + "@angular/common": "21.1.1", + "@angular/core": "21.1.1", + "@angular/platform-browser": "21.1.1", "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, "node_modules/@appsignal/javascript": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.6.1.tgz", @@ -1619,13 +2307,26 @@ "@appsignal/javascript": "=1.6.1" } }, + "node_modules/@authress/login": { + "version": "2.6.417", + "resolved": "https://registry.npmjs.org/@authress/login/-/login-2.6.417.tgz", + "integrity": "sha512-3iMjpwnU3iWTpVjS5nc1/7QrIresFS+TKN43R9UtV/khW2liyq9CPyX5ZCjZ74TWEXOckhTwqy9s7VpHlZ8TWw==", + "license": "Apache-2.0", + "dependencies": { + "cookie": "<1", + "lodash.take": "^4.1.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -1634,29 +2335,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1685,12 +2387,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1713,12 +2416,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1737,17 +2440,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -1762,18 +2466,20 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -1788,6 +2494,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1797,6 +2504,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", @@ -1809,10 +2517,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1835,39 +2544,41 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1881,6 +2592,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" }, @@ -1889,10 +2601,11 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1902,6 +2615,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", @@ -1915,14 +2629,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1936,6 +2651,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -1967,9 +2683,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1985,37 +2701,40 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -2025,13 +2744,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2045,6 +2765,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2060,6 +2781,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2075,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -2088,13 +2811,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2108,6 +2832,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -2116,12 +2841,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2131,12 +2857,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2150,6 +2877,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -2166,6 +2894,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2181,6 +2910,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", @@ -2198,6 +2928,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2215,6 +2946,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2226,12 +2958,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2241,13 +2974,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2257,13 +2991,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2273,17 +3008,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2293,13 +3029,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2309,13 +3046,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2325,13 +3063,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2345,6 +3084,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2356,13 +3096,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2376,6 +3117,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2387,13 +3129,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2403,12 +3146,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2422,6 +3166,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2437,6 +3182,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -2453,6 +3199,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2466,12 +3213,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2485,6 +3233,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2496,12 +3245,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2515,6 +3265,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2530,6 +3281,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2542,13 +3294,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2558,15 +3311,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2580,6 +3334,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2596,6 +3351,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2612,6 +3368,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2623,12 +3380,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2638,12 +3396,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2653,16 +3412,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2676,6 +3436,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" @@ -2688,12 +3449,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2703,12 +3465,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -2723,6 +3486,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2734,13 +3498,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2750,14 +3515,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2771,6 +3537,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2782,12 +3549,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2797,13 +3565,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2817,6 +3586,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2828,10 +3598,11 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", - "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -2852,6 +3623,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2861,6 +3633,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2872,12 +3645,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -2892,6 +3666,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2907,6 +3682,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2922,6 +3698,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2937,6 +3714,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2948,13 +3726,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2968,6 +3747,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2980,13 +3760,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2996,16 +3777,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -3018,42 +3800,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -3084,6 +3866,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3093,6 +3876,7 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -3103,51 +3887,82 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3315,13 +4130,38 @@ "tslib": "2.4.1" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, - "engines": { - "node": ">=10.0.0" + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@emoji-mart/data": { @@ -3352,13 +4192,14 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -3368,13 +4209,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3384,13 +4226,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3400,13 +4243,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3416,13 +4260,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3432,13 +4277,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3448,13 +4294,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3464,13 +4311,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3480,13 +4328,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3496,13 +4345,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3512,13 +4362,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3528,13 +4379,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3544,13 +4396,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3560,13 +4413,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3576,13 +4430,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3592,13 +4447,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3608,13 +4464,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3624,13 +4481,14 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -3640,13 +4498,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -3656,13 +4515,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -3672,13 +4532,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -3688,13 +4549,14 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -3704,13 +4566,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -3720,13 +4583,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3736,13 +4600,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3752,13 +4617,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3768,10 +4634,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -3786,9 +4653,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -3800,6 +4667,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -3814,6 +4682,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0" }, @@ -3826,6 +4695,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -3833,10 +4703,23 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/css-tree": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.8.tgz", + "integrity": "sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==", + "dev": true, + "dependencies": { + "mdn-data": "2.23.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3846,7 +4729,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -3874,6 +4757,37 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -3895,10 +4809,11 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3911,6 +4826,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -3920,6 +4836,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -3987,16 +4904,17 @@ } }, "node_modules/@fullcalendar/angular": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.19.tgz", - "integrity": "sha512-a3TmjKnF8xprH1aNgFn9zYehEhM4GBAyh+91SJymno2j1cE8D8z0+W1HNwtDekKWwJt/5YoinCvDTHydmF/kKw==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.20.tgz", + "integrity": "sha512-/V5wZuZSzWZxD3dnVteqY844Onv6we5ah0RU9ZJdRIeNbBFknHLeVYpIjYKsAPwkGigYX7UGOJR6NNpyarBLlQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "12 - 20", - "@angular/core": "12 - 20", - "@fullcalendar/core": "~6.1.19" + "@angular/common": "12 - 21", + "@angular/core": "12 - 21", + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/common": { @@ -4008,72 +4926,80 @@ } }, "node_modules/@fullcalendar/core": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.19.tgz", - "integrity": "sha512-z0aVlO5e4Wah6p6mouM0UEqtRf1MZZPt4mwzEyU6kusaNL+dlWQgAasF2cK23hwT4cmxkEmr4inULXgpyeExdQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.20.tgz", + "integrity": "sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==", + "license": "MIT", "dependencies": { "preact": "~10.12.1" } }, "node_modules/@fullcalendar/daygrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.19.tgz", - "integrity": "sha512-IAAfnMICnVWPjpT4zi87i3FEw0xxSza0avqY/HedKEz+l5MTBYvCDPOWDATpzXoLut3aACsjktIyw9thvIcRYQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.20.tgz", + "integrity": "sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==", + "license": "MIT", "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/interaction": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.19.tgz", - "integrity": "sha512-GOciy79xe8JMVp+1evAU3ytdwN/7tv35t5i1vFkifiuWcQMLC/JnLg/RA2s4sYmQwoYhTw/p4GLcP0gO5B3X5w==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.20.tgz", + "integrity": "sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==", + "license": "MIT", "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/list": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.19.tgz", - "integrity": "sha512-knZHpAVF0LbzZpSJSUmLUUzF0XlU/MRGK+Py2s0/mP93bCtno1k2L3XPs/kzh528hSjehwLm89RgKTSfW1P6cA==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.20.tgz", + "integrity": "sha512-7Hzkbb7uuSqrXwTyD0Ld/7SwWNxPD6SlU548vtkIpH55rZ4qquwtwYdMPgorHos5OynHA4OUrZNcH51CjrCf2g==", + "license": "MIT", "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/moment": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-6.1.19.tgz", - "integrity": "sha512-wpP0yXSGPDFoY0P3BA6Nw35q/x9TNbnvkwVyu7qgaewepO2Ss10E1yNVM4EtDl82T5IDRcgmFSQ48z1vGcGe1g==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-6.1.20.tgz", + "integrity": "sha512-GS6gY/LKu/65TiRSW6qUJFW9SPYGkPERyOOJMrCHeoOP4sE8Ewl7g0N1H4S6HHFHDrI40T0x2bYAiPEhYZpIJA==", + "license": "MIT", "peerDependencies": { - "@fullcalendar/core": "~6.1.19", + "@fullcalendar/core": "~6.1.20", "moment": "^2.29.1" } }, "node_modules/@fullcalendar/moment-timezone": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-6.1.19.tgz", - "integrity": "sha512-6UOhMThdzDnh10/SPW5t5zmNq+betGebK3i7ytg2EHzlEb2EztfHJC5mbqEU2B2AoKNr2FUIonWuergYe7OVhA==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-6.1.20.tgz", + "integrity": "sha512-fGk3bQU4hf0rgw3Zd/PH6Ok0Db+s9/nsuALj3IG8GYFqInwLsHZI0Qc+ljN8jv9LrLS5sOBBOZHWDg2ncx1inw==", + "license": "MIT", "peerDependencies": { - "@fullcalendar/core": "~6.1.19", + "@fullcalendar/core": "~6.1.20", "moment-timezone": "^0.5.40" } }, "node_modules/@fullcalendar/premium-common": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.19.tgz", - "integrity": "sha512-bOWHm1u1dUy6M4fQ0hNK7qEI7SrVWrN1ovv/z4/FE/ybfM19ukz7SFs907Ur7KUBWLNKTQYXBtdrY/ginwWraw==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.20.tgz", + "integrity": "sha512-rT+AitNnRyZuFEtYvsB1OJ2g1Bq2jmTR6qdn/dEU6LwkIj/4L499goLtMOena/JyJ31VBztdHrccX//36QrY3w==", + "license": "SEE LICENSE IN LICENSE.md", "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/resource": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.19.tgz", - "integrity": "sha512-br1ylX/aIOfd8m7Tzl2LpJBSI+N9Q6aS1qw7K9qnQjYXWQyHBlfLG6ZcPmmkjfaqTUJc8ARRbtNWj1ts5qOZgQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.20.tgz", + "integrity": "sha512-vpQs1eYJbc1zGOzF3obVVr+XsHTMTG7STKVQBEGy3AeFgfosRkUz+3DUawmy98vSjJUYOAQHO+pWW0ek0n5g0w==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@fullcalendar/premium-common": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/resource-common": { @@ -4096,51 +5022,55 @@ } }, "node_modules/@fullcalendar/resource-timeline": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.19.tgz", - "integrity": "sha512-oC3aVR++dLqJNeBwmLHq9sDgRDFfIG0qSteV7bgBekvNlqEMqXx8wPjUxnELrq8rrhMmK4iV3wO7AB/48IVgyg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.20.tgz", + "integrity": "sha512-HAlM/I+9xJPzZx3Wry7l5oibc8n5Pv/iL8tp2dxUu/0zqS0UqADbHItJucuANfDDeL7PEbCbh/uFx9VvzRUIkQ==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@fullcalendar/premium-common": "~6.1.19", - "@fullcalendar/scrollgrid": "~6.1.19", - "@fullcalendar/timeline": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20", + "@fullcalendar/scrollgrid": "~6.1.20", + "@fullcalendar/timeline": "~6.1.20" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.19", - "@fullcalendar/resource": "~6.1.19" + "@fullcalendar/core": "~6.1.20", + "@fullcalendar/resource": "~6.1.20" } }, "node_modules/@fullcalendar/scrollgrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.19.tgz", - "integrity": "sha512-S1pbiYHvmV0ep6z5sWXJQfgW4Y/jrS5iLIAqSagDFPK0jr327nBxl7Ryi3Zb5UdMIP0/O4GXs8jwZabQPd8SOg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.20.tgz", + "integrity": "sha512-M55m0hxpou4IPObto5f0nVcXvIj3rkSTba0ypclSFDwBz3JxuCPS6l8kaUznqlZCr2Ld/HFJr+jwyvY070AafQ==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@fullcalendar/premium-common": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/timegrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.19.tgz", - "integrity": "sha512-OuzpUueyO9wB5OZ8rs7TWIoqvu4v3yEqdDxZ2VcsMldCpYJRiOe7yHWKr4ap5Tb0fs7Rjbserc/b6Nt7ol6BRg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.20.tgz", + "integrity": "sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==", + "license": "MIT", "dependencies": { - "@fullcalendar/daygrid": "~6.1.19" + "@fullcalendar/daygrid": "~6.1.20" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@fullcalendar/timeline": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.19.tgz", - "integrity": "sha512-d2P961mnUTXtJeWNmIq1neoDmZcrPUaK7nGFoc+jQAlnmG3aNSVWQmD1ia694AMqLWtcWkwipW9MuaJgx2QvrA==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.20.tgz", + "integrity": "sha512-yhTgMNDWfB+XqEUTLWrpPjM4fcvGYLOA9DvTp1ysdeqhRGoZnRK9Iv2WW5BaKT+VXhXoAPrj2Ud/lXt6youWAQ==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@fullcalendar/premium-common": "~6.1.19", - "@fullcalendar/scrollgrid": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20", + "@fullcalendar/scrollgrid": "~6.1.20" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.19" + "@fullcalendar/core": "~6.1.20" } }, "node_modules/@github/auto-check-element": { @@ -4233,19 +5163,19 @@ } }, "node_modules/@hocuspocus/common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.0.tgz", - "integrity": "sha512-vN0kE/mGTjuwchq16naq+nEjFDmeSLNCkDSAB7DKvpZnuG4KQi5oC42VFdKbq/baQTbDMSe82rI7f9riOR8idQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz", + "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==", "dependencies": { "lib0": "^0.2.87" } }, "node_modules/@hocuspocus/provider": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.0.tgz", - "integrity": "sha512-SXiHk4I2n1BqX1KuXgNDHpgMXseWbCIsaXT/lGaFq+qCF5F92cAmIg4mUPUQ39L1ugKM6Hm7tX33X+Jsk7466g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.4.tgz", + "integrity": "sha512-KbsMAfdYcIJD8eMU/5QnpXcSOvIWAcCNI33FSRSaKCIpYBFtAwkYIwWnZJmPZ8a1BMAtqQc+uvy9+UQf7GHnGQ==", "dependencies": { - "@hocuspocus/common": "^3.4.0", + "@hocuspocus/common": "^3.4.4", "@lifeomic/attempt": "^3.0.2", "lib0": "^0.2.87", "ws": "^8.17.1" @@ -4255,6 +5185,18 @@ "yjs": "^13.6.8" } }, + "node_modules/@hono/node-server": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", + "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@hotwired/stimulus": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz", @@ -4278,16 +5220,16 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.49.0.tgz", - "integrity": "sha512-+a1XZnp/gWer4CLd6hgR/dC9R3ew4ozSag4J4KSlHB4haYiCtOcT1vnIFDnqs9bWsJhROtjFHkGwRYsyPH76XA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.54.0.tgz", + "integrity": "sha512-9sXFPCiLL+PtppXUJoZZ9GjnaCck+oH+YwN4ZJZ4TC22vaMKVuuEuscxaGLwh6EdWFbKslrc9hlKiMAMJKoFdw==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.49.0", - "@html-eslint/template-parser": "^0.49.0", - "@html-eslint/template-syntax-parser": "^0.49.0", - "@html-eslint/types": "^0.49.0" + "@html-eslint/parser": "^0.54.0", + "@html-eslint/template-parser": "^0.54.0", + "@html-eslint/template-syntax-parser": "^0.54.0", + "@html-eslint/types": "^0.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4297,41 +5239,44 @@ } }, "node_modules/@html-eslint/parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.49.0.tgz", - "integrity": "sha512-moB2CWd8kSiOqp+ibT4awHx7pw1irkON5GwiXP0JlHRHAGIll18lBuHKtY9K/vkok97Pq1zjoyl5T7Z+fFtufQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.54.0.tgz", + "integrity": "sha512-ia3I/6jf87679pUrhIDKSgddKbw9GLkvO86fYt7tJQHHRQu+zySErIxuI2b941oeovzOq10dTpC5Hp41qbvPgg==", "dev": true, "dependencies": { - "@html-eslint/template-syntax-parser": "^0.49.0", - "@html-eslint/types": "^0.49.0", + "@eslint/css-tree": "^3.6.8", + "@html-eslint/template-syntax-parser": "^0.54.0", + "@html-eslint/types": "^0.54.0", + "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.49.0.tgz", - "integrity": "sha512-ciW0BFcW1iTqpT+aQOfjCelwcjLpqQMx/iLGevDQv8QHBdT43J89aAGPbv140KnYgUhQPnu9hFUV3goXWSu+gA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.54.0.tgz", + "integrity": "sha512-gSjgmGwRQehNxZ3XdRUhUoXDFzYc/LYoKA7JwExjdvklGnSh5WkH/CLOlphkDh9jJsC1O/E0I04bVGrzy3idKQ==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.49.0", + "@html-eslint/types": "^0.54.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-syntax-parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.49.0.tgz", - "integrity": "sha512-TSW1gWU+cfYX47OVXtNoY+r7ALoY+87q3jkPrfGuccy5ODNfUR62jaH2lCfdMwGW+C6jhEzc83Uiije89UI72Q==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.54.0.tgz", + "integrity": "sha512-7mDM4AWqz42FHwnOt8Lu5xqovaZHlEuBrmwNrMg6VwC9TPaLVyh4j3zNzNnM6tjftaXZzverJup39zGB8mvXjg==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.49.0" + "@html-eslint/types": "^0.54.0" } }, "node_modules/@html-eslint/types": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.49.0.tgz", - "integrity": "sha512-7d+jT37S47xZYXm7P6c5gTxGoYP8KqavpT1dh3VUWmoQBAButHrO4o56TZWZHJUP3GBkafOt7dE0wTQFflukiw==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.54.0.tgz", + "integrity": "sha512-bfJolxay0POMYaFWTCH1MBitEaxIEKZOoROGOLZiRBaPvQrzhwYQktuyt5X1PcHqUB4HwEtYgSdpjYGT4JbrvA==", "dev": true, "dependencies": { + "@types/css-tree": "^2.3.11", "@types/estree": "^1.0.6", "es-html-parser": "0.3.1", "eslint": "^9.39.1" @@ -4348,38 +5293,25 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -4402,16 +5334,26 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.1.tgz", - "integrity": "sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4426,13 +5368,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", - "dev": true, + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4447,19 +5389,19 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4473,21 +5415,6 @@ } } }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4515,13 +5442,14 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", - "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4536,13 +5464,14 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4557,12 +5486,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "engines": { "node": ">=18" @@ -4577,32 +5507,38 @@ } }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4617,12 +5553,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4637,13 +5574,14 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4658,40 +5596,21 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", - "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.2.1", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.17", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts/node_modules/@inquirer/confirm": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.15.tgz", - "integrity": "sha512-SwHMGa8Z47LawQN0rog0sT+6JpiL0B7eW9p1Bb7iCeKDGTI5Ez25TSc2l8kw52VV7hA4sX/C78CGkMrKXfuspA==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" }, "engines": { "node": ">=18" @@ -4706,13 +5625,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4727,14 +5647,15 @@ } }, "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4749,15 +5670,16 @@ } }, "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4772,9 +5694,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "license": "MIT", "engines": { "node": ">=18" @@ -4807,96 +5729,6 @@ "node": "20 || >=22" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -4928,6 +5760,16 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -4941,15 +5783,17 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.29", @@ -4987,11 +5831,52 @@ "node": ">=8.9.0" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -5004,15 +5889,41 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { "node": ">=10.0" @@ -5026,10 +5937,15 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, "engines": { "node": ">=10.0" }, @@ -5042,9 +5958,9 @@ } }, "node_modules/@knowledgecode/delegate": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@knowledgecode/delegate/-/delegate-0.8.5.tgz", - "integrity": "sha512-Wuv1m5t170SWW6R60zgOKg14s230buKfrd8tjpmeG/lKBFcYjQSvZoOZh34isygkvJkBHY2ozdg2E3rzJy3Ehg==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@knowledgecode/delegate/-/delegate-0.10.0.tgz", + "integrity": "sha512-bu6T27FlgX+rZY6xKGvM7M6dPXtSaHTj/RpFXoD7bkFths3hn/dqg84uqQWSJTGFljeBBjyzdAlI9eSV0bI1HA==", "license": "MIT" }, "node_modules/@kolkov/ngx-gallery": { @@ -5078,18 +5994,19 @@ "license": "MIT" }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", - "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", + "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", + "license": "MIT", "dependencies": { - "@inquirer/type": "^3.0.7" + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { "@inquirer/prompts": ">= 3 < 8", - "listr2": "9.0.1" + "listr2": "9.0.5" } }, "node_modules/@lit-labs/ssr-dom-shim": { @@ -5097,92 +6014,108 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" }, + "node_modules/@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", - "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.4.tgz", + "integrity": "sha512-XaKL705gDWd6XVls3ATDj13ZdML/LqSIxwgnYpG8xTzH2ifArx8fMMDdvqGE/Emd+W6R90W2fveZcJ0AyS8Y0w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", - "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.4.tgz", + "integrity": "sha512-GPHGEVcwJlkD01GmIr7B4kvbIcUDS2+kBadVEd7lU4can1RZaZQLDDBJRrrNfS2Kavvl0VLI/cMv7UASAXGrww==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", - "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.4.tgz", + "integrity": "sha512-cmev5/dZr5ACKri9f6GU6lZCXTjMhV72xujlbOhFCgFXrt4W0TxGsmY8kA1BITvH60JBKE50cSxsiulybAbrrw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", - "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.4.tgz", + "integrity": "sha512-mALqr7DE42HsiwVTKpQWxacjHoJk+e9p00RWIJqTACh/hpucxp/0lK/XMh5XzWnU/TDCZLukq1+vNqnNumTP/Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", - "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.4.tgz", + "integrity": "sha512-QjLs8OcmCNcraAcLoZyFlo0atzBJniQLLwhtR+ymQqS5kLYpV5RqwriL87BW+ZiR9ZiGgZx3evrz5vnWPtJ1fQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", - "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.4.tgz", + "integrity": "sha512-tr/pwHDlZ33forLGAr0tI04cRmP4SgF93yHbb+2zvZiDEyln5yMHhbKDySxY66aUOkhvBvTuHq9q/3YmTj6ZHQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", - "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.4.tgz", + "integrity": "sha512-KRzfocJzB/mgoTCqnMawuLSKheHRVTqWfSmouIgYpFs6Hx4zvZSvsZKSCEb5gHmICy7qsx9l06jk3MFTtiFVAQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -5304,9 +6237,10 @@ } }, "node_modules/@mantine/core": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.7.tgz", - "integrity": "sha512-7gUTiUrD0pukpkSNvScGi/e+pBuBWYJP5yFHT4TFf1fmaQAA7PbNoAzUeEkPbVromDtK0VdEcpRlYpDnJhpz2g==", + "version": "8.3.12", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.12.tgz", + "integrity": "sha512-bDEoUl4SneltfI1GeEaBk6BVDbLuB/w15YwseAmUvc8ldAbNcsVhxKxY/BdhwqUo6O3L2vhdlb3WwxR1y8741g==", + "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.16", "clsx": "^2.1.1", @@ -5316,7 +6250,7 @@ "type-fest": "^4.41.0" }, "peerDependencies": { - "@mantine/hooks": "8.3.7", + "@mantine/hooks": "8.3.12", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } @@ -5352,11 +6286,14 @@ "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", - "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", + "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", + "license": "MIT", "dependencies": { - "ajv": "^6.12.6", + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", @@ -5364,19 +6301,34 @@ "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } } }, "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -5385,25 +6337,28 @@ "node": ">= 0.6" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ajv": "^8.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -5411,7 +6366,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", + "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -5424,20 +6379,23 @@ } }, "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", "engines": { "node": ">=6.6.0" } @@ -5446,6 +6404,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5462,6 +6421,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5470,6 +6430,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -5509,9 +6470,10 @@ } }, "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -5521,13 +6483,18 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5536,6 +6503,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -5552,9 +6520,10 @@ } }, "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5566,15 +6535,11 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5583,6 +6548,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -5594,47 +6560,41 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -5645,50 +6605,37 @@ "node": ">= 0.10" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -5697,12 +6644,17 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5711,6 +6663,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -5728,6 +6681,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5741,6 +6695,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5754,6 +6709,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5767,6 +6723,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5780,6 +6737,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5793,6 +6751,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6103,6 +7062,23 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, "node_modules/@ng-select/ng-option-highlight": { "version": "20.6.3", "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-20.6.3.tgz", @@ -6144,9 +7120,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.12.tgz", - "integrity": "sha512-ePuofHOtbgvEq2t+hcmL30s4q9HQ/nv9ABwpLiELdVIObcWUnrnizAvM7hujve/9CQL6gRCeEkxPLPS4ZrK9AQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.1.tgz", + "integrity": "sha512-8ySRsb1xgr+7XQmZ2LJ+AhFe1IZKW93wfL6OMpZtcWU4FzxWa/NhlfSNBQI5kuyPEVDDAxJ4RI5IoQyvcOmNLg==", "dev": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -6154,97 +7130,65 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^20.0.0", - "typescript": ">=5.8 <6.0", + "@angular/compiler-cli": "^21.0.0", + "typescript": ">=5.9 <6.0", "webpack": "^5.54.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", + "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.1.tgz", + "integrity": "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==", "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git/node_modules/isexe": { @@ -6257,15 +7201,18 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -6274,106 +7221,62 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "license": "ISC", "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", + "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", "license": "ISC", "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "license": "ISC", "dependencies": { - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { @@ -6386,9 +7289,9 @@ } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -6397,33 +7300,33 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", + "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/run-script/node_modules/isexe": { @@ -6436,9 +7339,9 @@ } }, "node_modules/@npmcli/run-script/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -6447,7 +7350,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@oddbird/popover-polyfill": { @@ -6469,9 +7372,9 @@ } }, "node_modules/@openproject/primer-view-components": { - "version": "0.79.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.79.1.tgz", - "integrity": "sha512-8VBJB/+BdnvYSWA46XnLhUyE2PNf/fvdBQiPCa03bWkkP8VChEIb4hrMB51Df1LmqoaV4WWjeIJlGYCxokXi/Q==", + "version": "0.80.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.80.2.tgz", + "integrity": "sha512-ttQM5K+VRvMsxGH7HIG8QFTBw5xeIsBmvYOknQwhtNtNkj0j+fWU19osL982m/jy45evgEo0eQ/FIdEWywfrlg==", "license": "MIT", "dependencies": { "@github/auto-check-element": "^6.0.0", @@ -6503,6 +7406,16 @@ "rxjs": "^7.8.0" } }, + "node_modules/@oxc-project/types": { + "version": "0.106.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.106.0.tgz", + "integrity": "sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", @@ -6819,32 +7732,15 @@ "dev": true, "optional": true }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, "node_modules/@primer/behaviors": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" }, "node_modules/@primer/css": { - "version": "22.0.2", - "resolved": "https://registry.npmjs.org/@primer/css/-/css-22.0.2.tgz", - "integrity": "sha512-FfXd1ga05oewKjDRi9cPmy7BSnb/6QOjTIxAtDj94Hoyk+qJxHhgvhbcnZwBfL3WKP6HeUT3PnsT9k+43Bmg3Q==", - "license": "MIT", + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@primer/css/-/css-22.1.0.tgz", + "integrity": "sha512-Nwg9QaRiBeu0BU6h+Su0X07daihX1obiuqGRG8y+SexOnvWhN2J5n4OFAvGfQsit07Y7Q6gGoK+yVU5tb8CtDA==", "engines": { "node": ">=16.0.0" }, @@ -6873,15 +7769,16 @@ } }, "node_modules/@primer/primitives": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.1.tgz", - "integrity": "sha512-f5FXeUHQ0iyxt1UF6MqeajQ9jRV/7uOGLECU5KuFWhMioCZOho09jS6alZA9tiwksHr2LYXfo7AdFczpEz3Npw==" + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", + "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==", + "license": "MIT" }, "node_modules/@primer/view-components": { "name": "@openproject/primer-view-components", - "version": "0.79.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.79.1.tgz", - "integrity": "sha512-8VBJB/+BdnvYSWA46XnLhUyE2PNf/fvdBQiPCa03bWkkP8VChEIb4hrMB51Df1LmqoaV4WWjeIJlGYCxokXi/Q==", + "version": "0.80.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.80.2.tgz", + "integrity": "sha512-ttQM5K+VRvMsxGH7HIG8QFTBw5xeIsBmvYOknQwhtNtNkj0j+fWU19osL982m/jy45evgEo0eQ/FIdEWywfrlg==", "license": "MIT", "dependencies": { "@github/auto-check-element": "^6.0.0", @@ -6926,9 +7823,9 @@ "integrity": "sha512-ybBsUrIsu5geM8BtqnpM7ZA9D8uzSz+e1B4JR57NaCmasHKWap6AX5DT7NHIbp21opVet1qqoVSdsoLDqXeB2A==" }, "node_modules/@rails/request.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.12.tgz", - "integrity": "sha512-g3//JBja1s04Zflj7IoMLQuXza9i4ZvtLmm0r0dMwh1QQUs6rL2iKUOGGyERfLsd81SnXC5ucfVV//rtsDlEEA==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.13.tgz", + "integrity": "sha512-7MXmjFOPuaxpjG8brqKJG0EfIe9ak6R0wRnjCBtRuADNFbdlRxETdKx1T5NVU4Ato3iZOkEpeSUEuLboL3tCGA==", "license": "MIT" }, "node_modules/@remirror/core-constants": { @@ -6937,10 +7834,238 @@ "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", "license": "MIT" }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.58.tgz", + "integrity": "sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.58.tgz", + "integrity": "sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.58.tgz", + "integrity": "sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.58.tgz", + "integrity": "sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.58.tgz", + "integrity": "sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.58.tgz", + "integrity": "sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.58.tgz", + "integrity": "sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.58.tgz", + "integrity": "sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.58.tgz", + "integrity": "sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.58.tgz", + "integrity": "sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.58.tgz", + "integrity": "sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", "cpu": [ "arm" ], @@ -6952,9 +8077,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", "cpu": [ "arm64" ], @@ -6966,9 +8091,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", "cpu": [ "arm64" ], @@ -6980,9 +8105,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", "cpu": [ "x64" ], @@ -6994,9 +8119,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", "cpu": [ "arm64" ], @@ -7008,9 +8133,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", "cpu": [ "x64" ], @@ -7022,9 +8147,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", "cpu": [ "arm" ], @@ -7036,9 +8161,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", "cpu": [ "arm" ], @@ -7050,9 +8175,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", "cpu": [ "arm64" ], @@ -7064,9 +8189,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", "cpu": [ "arm64" ], @@ -7078,9 +8203,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", "cpu": [ "loong64" ], @@ -7092,9 +8231,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", "cpu": [ "ppc64" ], @@ -7106,9 +8259,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", "cpu": [ "riscv64" ], @@ -7120,9 +8273,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", "cpu": [ "riscv64" ], @@ -7134,9 +8287,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", "cpu": [ "s390x" ], @@ -7148,9 +8301,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", "cpu": [ "x64" ], @@ -7162,9 +8315,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", "cpu": [ "x64" ], @@ -7175,10 +8328,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", "cpu": [ "arm64" ], @@ -7190,9 +8357,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", "cpu": [ "arm64" ], @@ -7204,9 +8371,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", "cpu": [ "ia32" ], @@ -7218,9 +8385,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", "cpu": [ "x64" ], @@ -7232,9 +8399,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", "cpu": [ "x64" ], @@ -7252,12 +8419,12 @@ "dev": true }, "node_modules/@schematics/angular": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.12.tgz", - "integrity": "sha512-ikl+nkWUab/Z4eSkBHgq9FLIUH8qh4OcYKeBQ0fyWqIUFHyjjK0JOfwmH1g/3zAmuUMtkthHCehAtyKzCTQjVA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.1.tgz", + "integrity": "sha512-WijqITteakpFOplx7IGHIdBOdTU04Ul4qweilY1CRK3KdzQRuAf31KiKUFrJiGW076cyokmAQmBoZcngh9rCNw==", "dependencies": { - "@angular-devkit/core": "20.3.12", - "@angular-devkit/schematics": "20.3.12", + "@angular-devkit/core": "21.1.1", + "@angular-devkit/schematics": "21.1.1", "jsonc-parser": "3.3.1" }, "engines": { @@ -7266,6 +8433,183 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.1.tgz", + "integrity": "sha512-3ptEOuALghEYEPVbhRa7g8a+YmvmHqHVNqF9XqCbG22nPGWkE58qfNNbXi3tF9iQxzKSGw5Iy5gYUvSvpsdcfw==", + "dependencies": { + "@angular-devkit/core": "21.1.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.0.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@schematics/angular/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@schematics/angular/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@schematics/angular/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@schematics/angular/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@schematics/angular/node_modules/ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@schematics/angular/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@schematics/angular/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@schematics/angular/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@shikijs/types": { "version": "3.13.0", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", @@ -7283,77 +8627,77 @@ "license": "MIT" }, "node_modules/@sigstore/bundle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", - "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", + "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==", "license": "Apache-2.0", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", - "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", - "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", + "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/tuf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", - "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", + "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/verify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", - "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@socket.io/component-emitter": { @@ -7362,6 +8706,12 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, "node_modules/@stimulus-components/auto-submit": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@stimulus-components/auto-submit/-/auto-submit-6.0.0.tgz", @@ -7380,15 +8730,16 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.46.1", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.52.0", + "eslint-visitor-keys": "^5.0.0", + "espree": "^11.0.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, @@ -7400,13 +8751,13 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7636,16 +8987,17 @@ } }, "node_modules/@tiptap/extensions": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.11.0.tgz", - "integrity": "sha512-g43beA73ZMLezez1st9LEwYrRHZ0FLzlsSlOZKk7sdmtHLmuqWHf4oyb0XAHol1HZIdGv104rYaGNgmQXr1ecQ==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.15.3.tgz", + "integrity": "sha512-ycx/BgxR4rc9tf3ZyTdI98Z19yKLFfqM3UN+v42ChuIwkzyr9zyp7kG8dB9xN2lNqrD+5y/HyJobz/VJ7T90gA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.11.0", - "@tiptap/pm": "^3.11.0" + "@tiptap/core": "^3.15.3", + "@tiptap/pm": "^3.15.3" } }, "node_modules/@tiptap/pm": { @@ -7743,42 +9095,44 @@ } }, "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "minimatch": "^10.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -7843,6 +9197,12 @@ "@types/node": "*" } }, + "node_modules/@types/css-tree": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@types/css-tree/-/css-tree-2.3.11.tgz", + "integrity": "sha512-aEokibJOI77uIlqoBOkVbaQGC9zII0A+JH1kcTNKW2CwyYWD8KM6qdo+4c77wD3wZOQfJuNWAr9M4hdk+YhDIg==", + "dev": true + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -7869,6 +9229,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -7879,6 +9240,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -7946,9 +9308,10 @@ } }, "node_modules/@types/hotwired__turbo": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.4.tgz", - "integrity": "sha512-kgEKOms0taywPxPQvXUh90+G7M+phBHTiUw95Dosw0FU/we86iFerMfgBGcf3eQcAGs5pTNYnLMhiIlfRw/AfA==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.5.tgz", + "integrity": "sha512-lbbSGRg2QvyJJlF4LK4wVovQggUjLrMxpvgj66DFWt11GzdBBEjY2GQLoqFWfmc4AdBNPsSSw+l90DozZFtDfQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { @@ -7967,9 +9330,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.12.tgz", - "integrity": "sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-6.0.0.tgz", + "integrity": "sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==", "dev": true }, "node_modules/@types/jquery": { @@ -8001,8 +9364,7 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -8017,9 +9379,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "dev": true }, "node_modules/@types/markdown-it": { @@ -8100,9 +9462,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "version": "19.2.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", + "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", "dev": true, "dependencies": { "csstype": "^3.2.2" @@ -8242,20 +9604,19 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", - "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/type-utils": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8265,20 +9626,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.3", + "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8292,13 +9653,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8309,9 +9670,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8325,9 +9686,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8338,21 +9699,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8366,15 +9726,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8389,12 +9749,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -8414,6 +9774,23 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -8451,16 +9828,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", - "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8474,15 +9851,33 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", - "debug": "^4.3.4" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8495,14 +9890,33 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "node_modules/@typescript-eslint/project-service/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8513,10 +9927,11 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8529,16 +9944,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", - "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8553,14 +9968,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8574,13 +9989,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8591,9 +10006,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8607,9 +10022,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8620,21 +10035,20 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8648,15 +10062,15 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8671,12 +10085,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -8696,6 +10110,23 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -8724,10 +10155,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8737,21 +10169,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8769,11 +10201,218 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", @@ -8788,36 +10427,14 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -8833,6 +10450,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8909,6 +10527,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -8918,25 +10537,29 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -8947,13 +10570,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -8966,6 +10591,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -8975,6 +10601,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -8983,13 +10610,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -9006,6 +10635,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -9019,6 +10649,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -9031,6 +10662,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -9045,6 +10677,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -9075,13 +10708,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -9089,12 +10724,12 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/accepts": { @@ -9127,6 +10762,7 @@ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" }, @@ -9208,7 +10844,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -9231,80 +10866,149 @@ } }, "node_modules/algoliasearch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", - "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.2.tgz", + "integrity": "sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==", + "license": "MIT", "dependencies": { - "@algolia/abtesting": "1.1.0", - "@algolia/client-abtesting": "5.35.0", - "@algolia/client-analytics": "5.35.0", - "@algolia/client-common": "5.35.0", - "@algolia/client-insights": "5.35.0", - "@algolia/client-personalization": "5.35.0", - "@algolia/client-query-suggestions": "5.35.0", - "@algolia/client-search": "5.35.0", - "@algolia/ingestion": "1.35.0", - "@algolia/monitoring": "1.35.0", - "@algolia/recommend": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/abtesting": "1.12.2", + "@algolia/client-abtesting": "5.46.2", + "@algolia/client-analytics": "5.46.2", + "@algolia/client-common": "5.46.2", + "@algolia/client-insights": "5.46.2", + "@algolia/client-personalization": "5.46.2", + "@algolia/client-query-suggestions": "5.46.2", + "@algolia/client-search": "5.46.2", + "@algolia/ingestion": "1.46.2", + "@algolia/monitoring": "1.46.2", + "@algolia/recommend": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/angular-eslint": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.5.1.tgz", - "integrity": "sha512-7Vx2Vs4u5KO7Kxzo8kMAZnpubtHxK/wBWhBmHrKz/GRsrRQw2aIO13eCH6RU200EssNWpZ2OADIK0vlR9J0T0A==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.1.0.tgz", + "integrity": "sha512-qXpIEBNYpfgpBaFblnyFegVSQjWCVUdCXTHvMcvtNtmMgtPwIDKvG8wuJo5BbQ/MNt2d8npmnRUaS2ddzdCzww==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/builder": "20.5.1", - "@angular-eslint/eslint-plugin": "20.5.1", - "@angular-eslint/eslint-plugin-template": "20.5.1", - "@angular-eslint/schematics": "20.5.1", - "@angular-eslint/template-parser": "20.5.1", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/builder": "21.1.0", + "@angular-eslint/eslint-plugin": "21.1.0", + "@angular-eslint/eslint-plugin-template": "21.1.0", + "@angular-eslint/schematics": "21.1.0", + "@angular-eslint/template-parser": "21.1.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*", "typescript-eslint": "^8.0.0" } }, - "node_modules/angular-eslint/node_modules/@angular-eslint/builder": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.5.1.tgz", - "integrity": "sha512-jUnqrMbMQ/UR8xPncg3NW3I18dlnV68V0HHozZgX3rjHuDOa7Yq4jwjFaaxfaId5KsNDoEGtjZCAz1lgw/+4Gw==", + "node_modules/angular-eslint/node_modules/@angular-devkit/architect": { + "version": "0.2100.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2100.5.tgz", + "integrity": "sha512-KKmZMXzHCX0cWHY7xo9yy1J0fV7S/suhPO00YTcHBgLivkLsnbI177CrmWiMdLxSJD3NqTVkBEMPFQ2I2ooDFw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", - "@angular-devkit/core": ">= 20.0.0 < 21.0.0" + "@angular-devkit/core": "21.0.5", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/angular-eslint/node_modules/@angular-devkit/core": { + "version": "21.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", + "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/angular-eslint/node_modules/@angular-devkit/schematics": { + "version": "21.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.0.5.tgz", + "integrity": "sha512-U6Z/OEce3R9CJl8/xuVrNVp0uhv3Ac4wRjpG18kE0dh5R87ablhqr/wkP3rZbWpdGwuGSJ+cR7LE5IbwSswejA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.0.5", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.19", + "ora": "9.0.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/angular-eslint/node_modules/@angular-eslint/builder": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.1.0.tgz", + "integrity": "sha512-pcUlDkGqeZ+oQC0oEjnkDDlB96gbgHQhnBUKdhYAiAOSuiBod4+npP0xQOq5chYtRNPBprhDqgrJrp5DBeDMOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0" + }, + "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/angular-eslint/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.5.1.tgz", - "integrity": "sha512-0VroIEZzTBFB9B7Ws6xU5X3X9RoOSBVUcFbMs+UqfNoxHdZd5ToU5nwbImQg3hyFF0zdAjffoW3wW00qiC3L+g==", - "dev": true + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.1.0.tgz", + "integrity": "sha512-t52J6FszgEHaJ+IjuzU9qaWfVxsjlVNkAP+B5z2t4NDgbbDDsmI+QJh0OtP1qdlqzjh2pbocEml30KhYmNZm/Q==", + "dev": true, + "license": "MIT" }, "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.5.1.tgz", - "integrity": "sha512-We7vkqRypa4+TPFMy1VSJkNSTIezRYbDS3YuzycNT5G6fhY3nn4WMa3ejsID/llcvptWyTKSZXZ/rJ+Zvo8xuQ==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.1.0.tgz", + "integrity": "sha512-oNp+4UzN2M3KwGwEw03NUdXz93vqJd9sMzTbGXWF9+KVfA2LjckGDTrI6g6asGcJMdyTo07rDcnw0m0MkLB5VA==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "@angular-eslint/utils": "20.5.1", + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "@angular-eslint/utils": "21.1.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { @@ -9314,18 +11018,19 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.5.1.tgz", - "integrity": "sha512-J3efFHXACo84vT80p4Jq/rKeI1NwWru7qe9U6hCZetKbXz0dGgcGgh4gN8lWGtCqw1Gsi+xzpEGiHS1BWDDvmA==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.1.0.tgz", + "integrity": "sha512-FlbRfOCn8IUHvP1ebcCSQFVNh+4X/HqZqL7SW5oj9WIYPiOX9ijS03ndNbfX/pBPSIi8GHLKMjLt8zIy1l5Lww==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "@angular-eslint/utils": "20.5.1", + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "@angular-eslint/utils": "21.1.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { - "@angular-eslint/template-parser": "20.5.1", + "@angular-eslint/template-parser": "21.1.0", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", @@ -9333,46 +11038,111 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/schematics": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.5.1.tgz", - "integrity": "sha512-pPVbgiCCRDRKC2E3AeS0H3gC++azLarpYVTbOJS7vIGpmYqy++rKy5egXoECjHWQza/sXHJjUuHRpGhh/FN0og==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.1.0.tgz", + "integrity": "sha512-Hal1mYwx4MTjCcNHqfIlua31xrk2tZJoyTiXiGQ21cAeK4sFuY+9V7/8cxbwJMGftX0G4J7uhx8woOdIFuqiZw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/eslint-plugin": "20.5.1", - "@angular-eslint/eslint-plugin-template": "20.5.1", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/eslint-plugin": "21.1.0", + "@angular-eslint/eslint-plugin-template": "21.1.0", "ignore": "7.0.5", "semver": "7.7.3", "strip-json-comments": "3.1.1" + }, + "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0" } }, "node_modules/angular-eslint/node_modules/@angular-eslint/template-parser": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.5.1.tgz", - "integrity": "sha512-XIXf5zt7AurD1kjSAoMadLLB7VGuwg4+ln4JHfPN9MYwcIqJGZMt0brBkkFV7ed2M4167uT03yyfyTK8Ijl6qA==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.1.0.tgz", + "integrity": "sha512-PYVgNbjNtuD5/QOuS6cHR8A7bRqsVqxtUUXGqdv76FYMAajQcAvyfR0QxOkqf3NmYxgNgO3hlUHWq0ILjVbcow==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "eslint-scope": "^8.0.2" + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "eslint-scope": "^9.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, - "node_modules/angular-eslint/node_modules/@angular-eslint/utils": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.5.1.tgz", - "integrity": "sha512-6Zf9EBzW8eBTDxqgzBqKD4a9IH0uAVZFX9zgASipk8m5sO6YkjaS+auplmEac3ESzVCh9AzwNDFD68JAE0ugLQ==", + "node_modules/angular-eslint/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.1" + "ajv": "^8.0.0" }, "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/angular-eslint/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/angular-eslint/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/angular-eslint/node_modules/cli-spinners": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", + "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/eslint-scope": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.0.0.tgz", + "integrity": "sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/angular-eslint/node_modules/ignore": { @@ -9380,20 +11150,106 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/angular-eslint/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "node_modules/angular-eslint/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/angular-eslint/node_modules/ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/angular-eslint/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/animation-frame-polyfill": { @@ -9410,33 +11266,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -9457,6 +11286,21 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -9677,9 +11521,9 @@ "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "funding": [ { "type": "opencollective", @@ -9695,10 +11539,9 @@ } ], "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -9767,6 +11610,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", @@ -9781,6 +11625,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -9790,6 +11635,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" @@ -9803,6 +11649,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, @@ -9823,7 +11670,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-arraybuffer": { "version": "1.0.2", @@ -9833,6 +11681,26 @@ "node": ">= 0.6.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -9843,10 +11711,20 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/baseline-browser-mapping": { - "version": "2.8.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", - "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } @@ -9911,23 +11789,24 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -9943,12 +11822,43 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -9989,9 +11899,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -10006,12 +11916,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -10032,6 +11943,30 @@ "node": ">= 0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -10067,126 +12002,34 @@ } }, "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "license": "BlueOak-1.0.0", "engines": { - "node": ">=18" + "node": "20 || >=22" } }, "node_modules/call-bind": { @@ -10236,6 +12079,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -10255,9 +12104,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", "funding": [ { "type": "opencollective", @@ -10271,7 +12120,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", @@ -10283,6 +12133,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -10314,9 +12180,10 @@ } }, "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" }, "node_modules/chart.js": { "version": "4.5.1", @@ -10362,12 +12229,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/chrome-trace-event": { @@ -10375,6 +12242,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } @@ -10398,6 +12266,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -10407,25 +12276,25 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -10434,33 +12303,26 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "license": "MIT" - }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -10520,6 +12382,19 @@ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.20.tgz", "integrity": "sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10536,6 +12411,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -10564,7 +12449,8 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", @@ -10758,6 +12644,7 @@ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, + "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -10843,28 +12730,41 @@ } }, "node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", + "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -10897,6 +12797,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -11039,6 +12940,25 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-tree/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, "node_modules/css-what": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", @@ -11148,12 +13068,6 @@ "node": ">=4.0" } }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -11187,13 +13101,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -11290,10 +13206,11 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -11468,6 +13385,15 @@ "crossvent": "1.5.5" } }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -11487,12 +13413,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -11514,9 +13434,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.240", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz", - "integrity": "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==" + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" }, "node_modules/emoji-mart": { "version": "5.6.0", @@ -11527,7 +13448,8 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", @@ -11613,10 +13535,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -11646,6 +13569,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11673,6 +13597,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -11682,10 +13607,11 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -11779,7 +13705,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.3.1.tgz", "integrity": "sha512-YTEasG4xt7FEN4b6qJIPbFo/fzQ5kjRMEQ33QMqSXTvfXqAbC2rHxo32x2/1Rhq7Mlu6wI3MIpM5Kf2VHPXrUQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-iterator-helpers": { "version": "1.2.1", @@ -11809,10 +13736,11 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -11969,11 +13897,12 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -11981,39 +13910,40 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/esbuild-wasm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", - "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.27.2.tgz", + "integrity": "sha512-eUTnl8eh+v8UZIZh4MrMOKDAc8Lm7+NqP3pyuTORGFY1s/o9WoiJgKnwXy+te2J3hX7iRbFSHEyig7GsPeeJyw==", "dev": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -12047,10 +13977,11 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -12058,7 +13989,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -12375,6 +14306,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -12403,6 +14335,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12414,37 +14347,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -12458,11 +14360,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -12470,32 +14391,12 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/esniff": { "version": "2.0.1", @@ -12524,41 +14425,42 @@ } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -12635,6 +14537,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -12643,6 +14546,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" }, @@ -12651,17 +14555,18 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", - "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, "node_modules/express": { @@ -12714,6 +14619,7 @@ "version": "7.5.1", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", "engines": { "node": ">= 16" }, @@ -12766,21 +14672,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12828,32 +14719,18 @@ "node": ">=6.0.0" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -12870,15 +14747,6 @@ } ] }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -13102,34 +14970,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -13258,9 +15098,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", "engines": { "node": ">=18" @@ -13332,20 +15172,15 @@ } }, "node_modules/glob": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-12.0.0.tgz", - "integrity": "sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { "node": "20 || >=22" }, @@ -13365,6 +15200,23 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -13372,20 +15224,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob/node_modules/lru-cache": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", @@ -13424,9 +15262,9 @@ } }, "node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", "dev": true, "engines": { "node": ">=18" @@ -13467,12 +15305,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -13514,6 +15346,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -13869,22 +15710,25 @@ } }, "node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/hpack.js": { "version": "2.1.6", @@ -14117,43 +15961,6 @@ "node": ">=6" } }, - "node_modules/http-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/http-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/http-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/http-server/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -14165,17 +15972,6 @@ "node": ">=4" } }, - "node_modules/http-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -14194,6 +15990,7 @@ "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.18" } @@ -14239,20 +16036,12 @@ } } }, - "node_modules/i18next/node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14277,46 +16066,58 @@ "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.7.4.tgz", "integrity": "sha512-uCdSpLo3uMfqOmrwXTpR1k/sq4sSmKC7l4o/LdJOEU+MMMq+wkevRqOQYn3lP7vfz9Mv+USBEqPvi0XhdL9ENw==" }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "license": "ISC", "dependencies": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -14327,6 +16128,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -14381,12 +16183,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/internal-slot": { @@ -14404,24 +16206,14 @@ } }, "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -14457,7 +16249,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.0", @@ -14657,6 +16450,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -14782,7 +16588,8 @@ "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", @@ -14937,7 +16744,8 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", @@ -15045,15 +16853,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -15069,18 +16868,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -15134,21 +16921,6 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -15167,62 +16939,10 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jasmine-core": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.12.1.tgz", - "integrity": "sha512-P/UbRZ0LKwXe7wEpwDheuhunPwITn4oPALhrJEQJo6756EwNGnsK/TSQrWojBB4cQDQ+VaxWYws9tFNDuiMh2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.0.1.tgz", + "integrity": "sha512-gUtzV5ASR0MLBwDNqri4kBsgKNCcRQd9qOlNw/w/deavD0cl3JmWXXfH8JhKM4LTg6LPTt2IOQ4px3YYfgh2Xg==", "dev": true }, "node_modules/jasmine-spec-reporter": { @@ -15240,6 +16960,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -15249,20 +16970,12 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -15274,12 +16987,22 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, + "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/jquery": { @@ -15312,7 +17035,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -15323,19 +17045,13 @@ "node_modules/js-yaml/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -15351,12 +17067,12 @@ "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/json-schema-traverse": { @@ -15364,11 +17080,18 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -15401,7 +17124,8 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/jsx-ast-utils": { "version": "3.3.5", @@ -15789,10 +17513,11 @@ "integrity": "sha512-ZBqC+BBlofznDIY3SfjXDBVdIhYfz7bq8HAHztlw4XOnu++nHiWtCGPgzpdeAhPkByc68DaKNy3E3rY4XrdRtQ==" }, "node_modules/less": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", - "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", + "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -15846,6 +17571,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "optional": true, "bin": { "mime": "cli.js" @@ -15859,6 +17585,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -15869,6 +17596,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -15915,6 +17643,13 @@ } } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -15931,11 +17666,12 @@ "license": "MIT" }, "node_modules/listr2": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", - "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -15947,9 +17683,10 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -15958,9 +17695,10 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -15969,19 +17707,22 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, "node_modules/listr2/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -15995,9 +17736,10 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -16009,9 +17751,10 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -16024,21 +17767,61 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/lit": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-element": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-element/node_modules/lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/lit/node_modules/lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" } }, "node_modules/lmdb": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", - "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.4.tgz", + "integrity": "sha512-+Y2DqovevLkb6DrSQ6SXTYLEd6kvlRbhsxzgJrk7BUfOVA/mt21ak6pFDZDKxiAczHMWxrb02kXBTSTIA0O94A==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "msgpackr": "^1.11.2", @@ -16051,22 +17834,27 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.2", - "@lmdb/lmdb-darwin-x64": "3.4.2", - "@lmdb/lmdb-linux-arm": "3.4.2", - "@lmdb/lmdb-linux-arm64": "3.4.2", - "@lmdb/lmdb-linux-x64": "3.4.2", - "@lmdb/lmdb-win32-arm64": "3.4.2", - "@lmdb/lmdb-win32-x64": "3.4.2" + "@lmdb/lmdb-darwin-arm64": "3.4.4", + "@lmdb/lmdb-darwin-x64": "3.4.4", + "@lmdb/lmdb-linux-arm": "3.4.4", + "@lmdb/lmdb-linux-arm64": "3.4.4", + "@lmdb/lmdb-linux-x64": "3.4.4", + "@lmdb/lmdb-win32-arm64": "3.4.4", + "@lmdb/lmdb-win32-x64": "3.4.4" } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -16094,30 +17882,57 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.take": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.take/-/lodash.take-4.1.1.tgz", + "integrity": "sha512-3T118EQjnhr9c0aBKCCMhQn0OBwRMz/O2WaRU6VH0TSKoMCmFtUpr0iUp+eWKODEiRXtYOK7R7SiBneKHdk7og==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^5.3.0", @@ -16134,6 +17949,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -16146,6 +17962,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -16218,37 +18035,6 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "license": "MIT" }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -16356,6 +18142,7 @@ "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -16389,25 +18176,25 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", + "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", "license": "ISC", "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/make-fetch-happen/node_modules/negotiator": { @@ -16462,6 +18249,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -16691,6 +18490,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdn-data": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", + "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", + "dev": true + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -16718,19 +18523,19 @@ } }, "node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.52.0.tgz", + "integrity": "sha512-dG5ZY1wUCPWhtl4M2mlc7Wx4OrMGtiI79axnScxwDoPR/25biQYrYm21OpKyZcnKv8pvWaX95SRtZgecZ84gFg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" @@ -16786,16 +18591,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", @@ -17527,9 +19324,9 @@ } }, "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.0.tgz", + "integrity": "sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==", "license": "MIT", "dependencies": { "minipass": "^7.0.3", @@ -17537,7 +19334,7 @@ "minizlib": "^3.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -17634,9 +19431,9 @@ "license": "ISC" }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { "minipass": "^7.1.2" @@ -17681,10 +19478,11 @@ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -17695,10 +19493,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.8.tgz", + "integrity": "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==", "dev": true, + "license": "MIT", "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -17710,6 +19509,7 @@ "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -17776,6 +19576,7 @@ "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.3", @@ -17793,6 +19594,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -17814,7 +19616,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/next-tick": { "version": "1.1.0", @@ -17869,16 +19672,16 @@ } }, "node_modules/ngx-cookie-service": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-20.1.1.tgz", - "integrity": "sha512-jGjjIqu+Kt8De6YjDqTQOaUHKB7gYs0eaDuLyXfNhfKnA78lA7D7oWcaIzjkmXhRqTnh2/ex1UHmZHN9MX0yoQ==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-21.1.0.tgz", + "integrity": "sha512-W3IsoMImUVNt0ZuMesEuQJUGrEgKJaPkQGGfCg7zjUGM/EaeAIbIkfNktNIgUDmeUYapZQJa2pSg4YuK4v1gVQ==", "license": "MIT", "dependencies": { - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "peerDependencies": { - "@angular/common": "^20.0.0", - "@angular/core": "^20.0.0" + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0" } }, "node_modules/node-addon-api": { @@ -17886,6 +19689,7 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-forge": { @@ -17898,27 +19702,27 @@ } }, "node_modules/node-gyp": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", - "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.1.0.tgz", + "integrity": "sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==", "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", + "tar": "^7.5.2", "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/node-gyp-build-optional-packages": { @@ -17926,6 +19730,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.1" @@ -17936,15 +19741,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/node-gyp/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -17954,42 +19750,10 @@ "node": ">=16" } }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/node-gyp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -17998,36 +19762,28 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/node-releases": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", - "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" }, "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/normalize-path": { @@ -18039,106 +19795,99 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", - "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", "license": "ISC", "dependencies": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "license": "ISC", "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "license": "ISC", "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", + "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/nth-check": { @@ -18358,6 +20107,95 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-data-validator": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/openapi-data-validator/-/openapi-data-validator-2.0.54.tgz", + "integrity": "sha512-JsqqILn+NwgsjA2wJsY+qvVqtkaWz7cnf7gbT+1Nm54+NSsQNguV+fd3Y6WefTkLug6PLws+zylfZ7QjD0s71Q==", + "license": "Apache-2.0", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0", + "ajv": "^8.5", + "ajv-formats": "^2.1", + "content-type": "^1.0", + "lodash.clonedeep": "^4.5", + "lodash.get": "^4.4", + "media-typer": "^1.1", + "require-from-string": "^2.0.2" + }, + "engines": { + "node": ">=14.5.0" + } + }, + "node_modules/openapi-data-validator/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/openapi-explorer": { + "version": "2.4.788", + "resolved": "https://registry.npmjs.org/openapi-explorer/-/openapi-explorer-2.4.788.tgz", + "integrity": "sha512-463tX2LYtyYJ8Jwgpi2U/Dan7rwfLZm+Ev8K/VZ01O84vyDpo14146jhnJnaMeU9tzmpPNmXrEiK609M1WeAVw==", + "license": "Apache-2.0", + "dependencies": { + "@authress/login": "^2.0", + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "color": "^4.2.3", + "i18next": "^21.9.0", + "json5": "^2.2.3", + "lit": "^2.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.merge": "^4.6.2", + "marked": "^4.0.16", + "openapi-data-validator": "^2.0.40", + "openapi-resolver": "^4.1.71", + "prismjs": "^1.29.0", + "randexp": "^0.5.3", + "xml-but-prettier": "^1.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/openapi-explorer/node_modules/i18next": { + "version": "21.10.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", + "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, + "node_modules/openapi-resolver": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/openapi-resolver/-/openapi-resolver-4.2.4.tgz", + "integrity": "sha512-AjR/hIVI5qfyI6VmTjpQIXjTmxmWjqXqxSqkRdeWQrUATYsTVNQ3uSxK8NJ7QEXwfiKyID/iWf9iPuBxoWWoiA==", + "license": "Apache-2.0", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.9", + "@babel/runtime-corejs3": "^7.18.9", + "js-yaml": "^4.1.1", + "lodash.clonedeepwith": "^4.5.0" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -18367,17 +20205,18 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -18387,6 +20226,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^5.3.0", @@ -18410,6 +20250,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -18422,6 +20263,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -18434,12 +20276,14 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, "license": "MIT" }, "node_modules/ora/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", @@ -18457,6 +20301,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -18469,10 +20314,11 @@ } }, "node_modules/ordered-binary": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", - "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/orderedmap": { @@ -18529,9 +20375,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "license": "MIT", "engines": { "node": ">=18" @@ -18566,35 +20412,29 @@ "node": ">= 4" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, "node_modules/pacote": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", - "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "version": "21.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.4.tgz", + "integrity": "sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==", "license": "ISC", "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^10.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" @@ -18625,6 +20465,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -18642,19 +20483,15 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -18674,7 +20511,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", - "dev": true, "dependencies": { "entities": "^6.0.0", "parse5": "^8.0.0", @@ -18688,7 +20524,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -18700,7 +20535,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, "dependencies": { "entities": "^6.0.0" }, @@ -18712,7 +20546,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", - "dev": true, "dependencies": { "parse5": "^8.0.0" }, @@ -18724,7 +20557,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -18736,7 +20568,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, "dependencies": { "entities": "^6.0.0" }, @@ -18783,26 +20614,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -18837,10 +20648,11 @@ } }, "node_modules/piscina": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", - "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.4.tgz", + "integrity": "sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==", "dev": true, + "license": "MIT", "engines": { "node": ">=20.x" }, @@ -18849,9 +20661,10 @@ } }, "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", "engines": { "node": ">=16.20.0" } @@ -18923,14 +20736,15 @@ } }, "node_modules/postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", + "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" + "jiti": "^2.5.1", + "semver": "^7.6.2" }, "engines": { "node": ">= 18.12.0" @@ -19036,6 +20850,19 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/preact": { "version": "10.12.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", @@ -19050,17 +20877,27 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/process-nextick-args": { @@ -19382,12 +21219,14 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, "engines": { "node": ">=6" } @@ -19416,11 +21255,12 @@ "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==" }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -19429,25 +21269,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "license": "MIT", + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } }, "node_modules/randombytes": { "version": "2.1.0", @@ -19467,37 +21300,69 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.0" + "react": "^19.2.4" } }, "node_modules/react-i18next": { @@ -19702,13 +21567,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -19743,17 +21610,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -19763,15 +21631,17 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" @@ -19918,6 +21788,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -19941,11 +21820,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -20050,6 +21930,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -20059,16 +21948,6 @@ "node": ">= 4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -20109,10 +21988,42 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rolldown": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.58.tgz", + "integrity": "sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.106.0", + "@rolldown/pluginutils": "1.0.0-beta.58" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.58", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.58", + "@rolldown/binding-darwin-x64": "1.0.0-beta.58", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.58", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.58", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.58", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.58", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.58", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.58", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.58", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.58", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.58", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.58" + } + }, "node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "dev": true, "license": "MIT", "dependencies": { @@ -20126,28 +22037,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" } }, @@ -20161,6 +22075,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -20173,9 +22088,10 @@ } }, "node_modules/router/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -20189,11 +22105,13 @@ } }, "node_modules/router/node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "engines": { - "node": ">=16" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/run-applescript": { @@ -20208,29 +22126,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -20304,10 +22199,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", - "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", + "integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20324,10 +22220,11 @@ } }, "node_modules/sass-loader": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", - "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", + "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", "dev": true, + "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -20368,6 +22265,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -20383,6 +22281,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -20392,11 +22291,15 @@ } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", "dev": true, - "optional": true + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scheduler": { "version": "0.27.0", @@ -20479,9 +22382,10 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -20820,56 +22724,57 @@ } }, "node_modules/sigstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", - "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -20879,12 +22784,15 @@ } }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20964,12 +22872,12 @@ } }, "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -21026,37 +22934,6 @@ "node": ">=12" } }, - "node_modules/source-map-explorer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/source-map-explorer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/source-map-explorer/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -21077,15 +22954,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map-explorer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map-explorer/node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -21114,18 +22982,6 @@ "rimraf": "bin.js" } }, - "node_modules/source-map-explorer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map-explorer/node_modules/temp": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", @@ -21262,9 +23118,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "license": "CC0-1.0" }, "node_modules/spdy": { @@ -21303,15 +23159,15 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", + "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/statuses": { @@ -21394,27 +23250,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -21552,19 +23387,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -21654,6 +23476,18 @@ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", "license": "MIT" }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -21680,115 +23514,53 @@ } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", + "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -21800,10 +23572,11 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -21838,6 +23611,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -21846,10 +23620,11 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -21896,13 +23671,18 @@ } }, "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } @@ -21933,13 +23713,13 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -21998,20 +23778,12 @@ "node": ">=0.6" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -22077,10 +23849,11 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -22152,23 +23925,23 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tuf-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", - "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "license": "MIT", "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.4.1", - "make-fetch-happen": "^14.0.3" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/tuf-js/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -22200,6 +23973,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -22326,10 +24100,11 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22339,15 +24114,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", - "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2" + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22362,20 +24137,19 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", - "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22385,22 +24159,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.2", + "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22414,6 +24188,179 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/typescript-eslint/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -22423,6 +24370,21 @@ "node": ">= 4" } }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ua-parser-js": { "version": "0.7.35", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", @@ -22466,11 +24428,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "dev": true, + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -22480,6 +24452,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -22489,19 +24462,21 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -22537,27 +24512,27 @@ } }, "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/unist-util-find-after": { @@ -22660,9 +24635,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -22677,6 +24652,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -22692,6 +24668,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -22856,12 +24833,12 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/vary": { @@ -22915,13 +24892,13 @@ } }, "node_modules/vite": { - "version": "7.1.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", - "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -23002,23 +24979,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/vite/node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -23035,9 +24995,9 @@ "license": "MIT" }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", + "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", "dev": true, "license": "MIT", "dependencies": { @@ -23062,6 +25022,7 @@ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/web-namespaces": { @@ -23075,10 +25036,11 @@ } }, "node_modules/webpack": { - "version": "5.101.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", - "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23088,22 +25050,22 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { @@ -23122,72 +25084,16 @@ } } }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", - "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -23220,6 +25126,33 @@ "ajv": "^8.8.2" } }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", @@ -23442,6 +25375,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -23454,6 +25388,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -23467,6 +25402,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -23475,13 +25411,15 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -23625,6 +25563,16 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -23642,54 +25590,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -23775,6 +25675,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xml-but-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", + "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.2" + } + }, "node_modules/y-prosemirror": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", @@ -23869,10 +25778,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors-cjs": { + "node_modules/yoctocolors": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", "engines": { "node": ">=18" @@ -23882,19 +25803,21 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.25 || ^4" } }, "node_modules/zod-validation-error": { @@ -23926,281 +25849,420 @@ } }, "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, "@algolia/abtesting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", - "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.2.tgz", + "integrity": "sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-abtesting": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", - "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.2.tgz", + "integrity": "sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-analytics": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", - "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.2.tgz", + "integrity": "sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-common": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", - "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==" + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.2.tgz", + "integrity": "sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==" }, "@algolia/client-insights": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", - "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.2.tgz", + "integrity": "sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-personalization": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", - "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.2.tgz", + "integrity": "sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-query-suggestions": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", - "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.2.tgz", + "integrity": "sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/client-search": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", - "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.2.tgz", + "integrity": "sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/ingestion": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", - "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.2.tgz", + "integrity": "sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/monitoring": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", - "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.2.tgz", + "integrity": "sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/recommend": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", - "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.2.tgz", + "integrity": "sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==", "requires": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "@algolia/requester-browser-xhr": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", - "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.2.tgz", + "integrity": "sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==", "requires": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" } }, "@algolia/requester-fetch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", - "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.2.tgz", + "integrity": "sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==", "requires": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" } }, "@algolia/requester-node-http": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", - "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.2.tgz", + "integrity": "sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==", "requires": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.46.2" } }, "@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "@angular-builders/common": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-4.0.0.tgz", - "integrity": "sha512-bepZI1KdXUVhDGqHOudZQJwucSbZWxfWzM+EHFXUoExUO0u7XEuHTF5bhtQZ+YU+ZK2Ayl26QbI/26Yj72vcFQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-5.0.3.tgz", + "integrity": "sha512-Dro3574mu4/xqmjdA3159+TXDhgTbIJpEY/iBETSKUvHJiCgHel+R3eT105RpHN5o7NaD2rau5Zk2wuZqOk35Q==", "dev": true, "requires": { - "@angular-devkit/core": "^20.0.0", + "@angular-devkit/core": "^21.0.0", "ts-node": "^10.0.0", "tsconfig-paths": "^4.2.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.0.tgz", + "integrity": "sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } } }, "@angular-builders/custom-esbuild": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/custom-esbuild/-/custom-esbuild-20.0.0.tgz", - "integrity": "sha512-ZFROfAiDPM+mvZQDCO7iP/0L9kZriMr9gPzs57WbME0KJIMjhcMnfRxOSx0uDwbwzt8lCTamv/nUvN1eW1d2bw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-esbuild/-/custom-esbuild-21.0.3.tgz", + "integrity": "sha512-Q56JTNVrmdm2XJEHu3HWsTcxXMREYZ2ROnuaUs7ZV02Tu8E9Y8ejk8LCsRFNe/LKciUUMzaM6B78nSkXrkkNjQ==", "dev": true, "requires": { - "@angular-builders/common": "4.0.0", - "@angular-devkit/architect": ">=0.2000.0 < 0.2100.0", - "@angular-devkit/core": "^20.0.0", - "@angular/build": "^20.0.0" + "@angular-builders/common": "5.0.3", + "@angular-devkit/architect": ">=0.2100.0 < 0.2200.0", + "@angular-devkit/core": "^21.0.0", + "@angular/build": "^21.0.0" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.2101.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.0.tgz", + "integrity": "sha512-vnNAzWXwSRGTHk2K7woIQsj7WDYZp69Z3DBdlxkK0H08ymkJ/ELbhN0/AnIJNNtYCqEb57AH7Ro98n422beDuw==", + "dev": true, + "requires": { + "@angular-devkit/core": "21.1.0", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.0.tgz", + "integrity": "sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } } }, "@angular-devkit/architect": { - "version": "0.2003.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.12.tgz", - "integrity": "sha512-5H40lAFF4CKY32C4HOp6bTlOF1f4WsGCwe7FjFQp9A+T7yoCBiHpIWt2JKTwV4sBoTKVDZOnuf0GG+UVKjQT4A==", + "version": "0.2003.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.14.tgz", + "integrity": "sha512-dVlWqaYu0PIgHTBu16uYUS6lJOIpXCpOYhPWuYwqdo7a4x2HcagPQ+omUZJTA6kukh7ROpKcRoiy/DsO/DgvUA==", + "dev": true, "requires": { - "@angular-devkit/core": "20.3.12", + "@angular-devkit/core": "20.3.14", "rxjs": "7.8.2" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.14.tgz", + "integrity": "sha512-hWQVi73aGdIRInJqNia79Yi6SzqEThkfLug3AdZiNuNvYMaxAI347yPQz4f3Dr/i0QuiqRq/T8zfqbr46tfCqg==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } } }, "@angular-devkit/build-angular": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.12.tgz", - "integrity": "sha512-HPepPbJA5vprYTWJaSCfpk0s1bPT6Ui6VjFOSb9oY+p9iq+MGkuB1I+swNcRcMLttyMD+FpbMd27F8jSeX5XVw==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.1.tgz", + "integrity": "sha512-h882zE4NpfXQIzCKq6cXq4FBTd43rLCLX5RZL/sa38cFVNDp51HNn+rU9l4PeXQOKllq4CVmj9ePgVecyMpr2Q==", "dev": true, "requires": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.12", - "@angular-devkit/build-webpack": "0.2003.12", - "@angular-devkit/core": "20.3.12", - "@angular/build": "20.3.12", - "@babel/core": "7.28.3", - "@babel/generator": "7.28.3", + "@angular-devkit/architect": "0.2101.1", + "@angular-devkit/build-webpack": "0.2101.1", + "@angular-devkit/core": "21.1.1", + "@angular/build": "21.1.1", + "@babel/core": "7.28.5", + "@babel/generator": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-transform-async-generator-functions": "7.28.0", "@babel/plugin-transform-async-to-generator": "7.27.1", - "@babel/plugin-transform-runtime": "7.28.3", - "@babel/preset-env": "7.28.3", - "@babel/runtime": "7.28.3", + "@babel/plugin-transform-runtime": "7.28.5", + "@babel/preset-env": "7.28.5", + "@babel/runtime": "7.28.4", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.3.12", + "@ngtools/webpack": "21.1.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.21", + "autoprefixer": "10.4.23", "babel-loader": "10.0.0", - "browserslist": "^4.21.5", + "browserslist": "^4.26.0", "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild": "0.25.9", - "esbuild-wasm": "0.25.9", - "fast-glob": "3.3.3", + "esbuild": "0.27.2", + "esbuild-wasm": "0.27.2", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.4.0", + "less": "4.4.2", "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", "mini-css-extract-plugin": "2.9.4", - "open": "10.2.0", - "ora": "8.2.0", + "open": "11.0.0", + "ora": "9.0.0", "picomatch": "4.0.3", - "piscina": "5.1.3", + "piscina": "5.1.4", "postcss": "8.5.6", - "postcss-loader": "8.1.1", + "postcss-loader": "8.2.0", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.90.0", - "sass-loader": "16.0.5", - "semver": "7.7.2", + "sass": "1.97.1", + "sass-loader": "16.0.6", + "semver": "7.7.3", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.43.1", + "terser": "5.44.1", + "tinyglobby": "0.2.15", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.101.2", - "webpack-dev-middleware": "7.4.2", + "webpack": "5.104.1", + "webpack-dev-middleware": "7.4.5", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "requires": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, "@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true }, - "autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "requires": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" + "ajv": "^8.0.0" } }, - "fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true + }, + "cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true + }, + "is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "requires": { + "is-inside-container": "^1.0.0" + } + }, "istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", @@ -24214,6 +26276,127 @@ "semver": "^7.5.4" } }, + "log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "requires": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + } + }, + "open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "requires": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + } + }, + "ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dev": true, + "requires": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + }, + "string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "requires": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.1.tgz", + "integrity": "sha512-gX5/4RT/1ZO6kyo6bEi8uSxZ5oqdolsi87PchKRJfFir2m8u101qs3H07o4KFgG4YlnPUwyHET3ae5YVhS/0xg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.2101.1", + "rxjs": "7.8.2" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "requires": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -24222,20 +26405,11 @@ } } }, - "@angular-devkit/build-webpack": { - "version": "0.2003.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.12.tgz", - "integrity": "sha512-IkhCU0nAsXYBQOfHu2gQBcYBKhaV1c8wYtu7MmelBcN/iUrG8hRf1sZx+ppUgsdZuBYxCiDiLpcfRVRCIASkvw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.2003.12", - "rxjs": "7.8.2" - } - }, "@angular-devkit/core": { "version": "20.3.12", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.12.tgz", "integrity": "sha512-ReFxd/UOoVDr3+kIUjmYILQZF89qg62POdY7a7OqBH7plmInFlYVSEDouJvGqj3LVCPiqTk2ZOSChbhS/eLxXA==", + "dev": true, "requires": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -24249,6 +26423,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "requires": { "ajv": "^8.0.0" } @@ -24256,7 +26431,8 @@ "picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true } } }, @@ -24264,6 +26440,7 @@ "version": "20.3.12", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.12.tgz", "integrity": "sha512-JqJ1u59y+Ud51k/8MHYzSP+aQOeC2PJBaDmMnvqfWVaIt6n3x4gc/VtuhqhpJ0SKulbFuOWgAfI6QbPFrgUYQQ==", + "dev": true, "requires": { "@angular-devkit/core": "20.3.12", "jsonc-parser": "3.3.1", @@ -24353,12 +26530,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true - }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true } } }, @@ -24384,49 +26555,100 @@ } } }, + "@angular-eslint/utils": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.1.0.tgz", + "integrity": "sha512-rWINgxGREu+NFUPCpAVsBGG8B4hfXxyswM0N5GbjykvsfB5W6PUix2Gsoh++iEsZPT+c9lvgXL5GbpwfanjOow==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "21.1.0" + }, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.1.0.tgz", + "integrity": "sha512-t52J6FszgEHaJ+IjuzU9qaWfVxsjlVNkAP+B5z2t4NDgbbDDsmI+QJh0OtP1qdlqzjh2pbocEml30KhYmNZm/Q==", + "dev": true + } + } + }, "@angular/animations": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.14.tgz", - "integrity": "sha512-Sx3/XNu2rR+R8T8JkJEaIpZDZPk0IecS0Ayt6HTanNUZXuw0HVou3vkjR5B2St5nM4MXs0gh+S6aLNuArtqJTQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.1.tgz", + "integrity": "sha512-OQRyNbFBCkuihdCegrpN/Np5YQ7uV9if48LAoXxT68tYhK3S/Qbyx2MzJpOMFEFNfpjXRg1BZr8hVcZVFnArpg==", "requires": { "tslib": "^2.3.0" } }, "@angular/build": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.12.tgz", - "integrity": "sha512-iAZve4VPviC8y6RFctyh3qFXSlP5mth9K46/0zasB4LV4pcmu8BrzIHERxIn/jCDNdVdPh973kxo1ksO4WpyuA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.1.tgz", + "integrity": "sha512-OqlfH7tkahw/lFT6ACU6mqt3AGgTxxT27JTqpzZOeGo1ferR9dq1O6/CT4GiNyr/Z1AMfs7rBWlQH68y1QZb2g==", "dev": true, "requires": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.12", - "@babel/core": "7.28.3", + "@angular-devkit/architect": "0.2101.1", + "@babel/core": "7.28.5", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.14", + "@inquirer/confirm": "5.1.21", "@vitejs/plugin-basic-ssl": "2.1.0", "beasties": "0.3.5", - "browserslist": "^4.23.0", - "esbuild": "0.25.9", + "browserslist": "^4.26.0", + "esbuild": "0.27.2", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", - "listr2": "9.0.1", - "lmdb": "3.4.2", - "magic-string": "0.30.17", + "listr2": "9.0.5", + "lmdb": "3.4.4", + "magic-string": "0.30.21", "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.0", "picomatch": "4.0.3", - "piscina": "5.1.3", - "rollup": "4.52.3", - "sass": "1.90.0", - "semver": "7.7.2", + "piscina": "5.1.4", + "rolldown": "1.0.0-beta.58", + "sass": "1.97.1", + "semver": "7.7.3", "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.1.11", - "watchpack": "2.4.4" + "tinyglobby": "0.2.15", + "undici": "7.18.2", + "vite": "7.3.0", + "watchpack": "2.5.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "dev": true, + "requires": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, "istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", @@ -24440,11 +26662,14 @@ "semver": "^7.5.4" } }, - "mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true + "magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, "picomatch": { "version": "4.0.3", @@ -24455,9 +26680,9 @@ } }, "@angular/cdk": { - "version": "20.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", - "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.1.tgz", + "integrity": "sha512-lzscv+A6FCQdyWIr0t0QHXEgkLzS9wJwgeOOOhtxbixxxuk7xVXdcK/jnswE1Maugh1m696jUkOhZpffks3psA==", "requires": { "parse5": "^8.0.0", "tslib": "^2.3.0" @@ -24479,30 +26704,73 @@ } }, "@angular/cli": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.12.tgz", - "integrity": "sha512-vqVyVjbFPCRMjA5evL7tV2JeR6Anuzb9WcXTMB17fr7uzKNNAvo7KyRaOJjp+TU4JDARTNyGPy0aywfPx7R60A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.1.tgz", + "integrity": "sha512-eXhHuYvruWHBn7lX3GuAyLq29+ELwPADOW8ShzZkWRPNlIDiFDsS5pXrxkM9ez+8f86kfDHh88Twevn4UBUqQg==", "requires": { - "@angular-devkit/architect": "0.2003.12", - "@angular-devkit/core": "20.3.12", - "@angular-devkit/schematics": "20.3.12", - "@inquirer/prompts": "7.8.2", - "@listr2/prompt-adapter-inquirer": "3.0.1", - "@modelcontextprotocol/sdk": "1.17.3", - "@schematics/angular": "20.3.12", + "@angular-devkit/architect": "0.2101.1", + "@angular-devkit/core": "21.1.1", + "@angular-devkit/schematics": "21.1.1", + "@inquirer/prompts": "7.10.1", + "@listr2/prompt-adapter-inquirer": "3.0.5", + "@modelcontextprotocol/sdk": "1.25.2", + "@schematics/angular": "21.1.1", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.35.0", - "ini": "5.0.0", + "algoliasearch": "5.46.2", + "ini": "6.0.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.1", - "npm-package-arg": "13.0.0", - "pacote": "21.0.0", - "resolve": "1.22.10", - "semver": "7.7.2", + "listr2": "9.0.5", + "npm-package-arg": "13.0.2", + "pacote": "21.0.4", + "parse5-html-rewriting-stream": "8.0.0", + "resolve": "1.22.11", + "semver": "7.7.3", "yargs": "18.0.0", - "zod": "3.25.76" + "zod": "4.3.5" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.2101.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.1.tgz", + "integrity": "sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==", + "requires": { + "@angular-devkit/core": "21.1.1", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "@angular-devkit/schematics": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.1.tgz", + "integrity": "sha512-3ptEOuALghEYEPVbhRa7g8a+YmvmHqHVNqF9XqCbG22nPGWkE58qfNNbXi3tF9iQxzKSGw5Iy5gYUvSvpsdcfw==", + "requires": { + "@angular-devkit/core": "21.1.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.0.0", + "rxjs": "7.8.2" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "requires": { + "ajv": "^8.0.0" + } + }, "ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -24513,6 +26781,16 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + }, + "cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==" + }, "cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", @@ -24528,29 +26806,54 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, - "hosted-git-info": { + "log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "requires": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + } + }, + "magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "ora": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", - "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", "requires": { - "lru-cache": "^11.1.0" + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, + "dependencies": { + "string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "requires": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + } + } } }, - "lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==" - }, - "npm-package-arg": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", - "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", - "requires": { - "hosted-git-info": "^9.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - } + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "string-width": { "version": "7.2.0", @@ -24563,9 +26866,9 @@ } }, "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "requires": { "ansi-regex": "^6.0.1" } @@ -24601,29 +26904,29 @@ } }, "@angular/common": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.14.tgz", - "integrity": "sha512-OOUvjTtnpktJLsNupA+GFT2q5zNocPdpOENA8aSrXvAheNybLjgi+otO3U3sQsvB1VwaoEZ9GT5O3lZlstnA/A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.1.tgz", + "integrity": "sha512-Di2I6TooHdKun3SqRr45o4LbWJq/ZdwUt3fg0X3obPYaP/f6TrFQ4TMjcl03EfPufPtoQx6O+d32rcWVLhDxyw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.15.tgz", - "integrity": "sha512-lMicIAFAKZXa+BCZWs3soTjNQPZZXrF/WMVDinm8dQcggNarnDj4UmXgKSyXkkyqK5SLfnLsXVzrX6ndVT6z7A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.1.tgz", + "integrity": "sha512-Urd3bh0zv0MQ//S7RRTanIkOMAZH/A7vSMXUDJ3aflplNs7JNbVqBwDNj8NoX1V+os+fd8JRJOReCc1EpH4ZKQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.14.tgz", - "integrity": "sha512-lFg9ikwRClzDPjdFiwynbVFIi1RJZf/0i+OHa3Ns2gzXxJeHNKMJrHHjWZ2DU4N2UpxH0YAPe22N9Bie28IuQQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.1.tgz", + "integrity": "sha512-CCB8SZS0BzqLOdOaMpPpOW256msuatYCFDRTaT+awYIY1vQp/eLXzkMTD2uqyHraQy8cReeH/P6optRP9A077Q==", "requires": { - "@babel/core": "7.28.3", + "@babel/core": "7.28.5", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", @@ -24642,11 +26945,11 @@ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "requires": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" } }, "cliui": { @@ -24665,9 +26968,9 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, "readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==" }, "string-width": { "version": "7.2.0", @@ -24718,59 +27021,71 @@ } }, "@angular/core": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.14.tgz", - "integrity": "sha512-rpyEbhWF6Fj/xI9IvNLZh5QBUYnoXuF7vX54CCtyQ2MHALxRR/aa1WRxjRM96cF2OqodQ/Gj3oYW8ei8hlBh4w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.1.tgz", + "integrity": "sha512-KFRCEhsi02pY1EqJ5rnze4mzSaacqh14D8goDhtmARiUH0tefaHR+uKyu4bKSrWga2T/ExG0DJX52LhHRs2qSw==", "requires": { "tslib": "^2.3.0" } }, "@angular/elements": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-20.3.14.tgz", - "integrity": "sha512-zJQn5LaWoAsyL5NT2o4PxiRZLi5oESFkbw5yRQMLw3CDhdFARLDDQtPwwieujuTZ2UNWni4RwBmkvDVXKmVM4A==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.1.tgz", + "integrity": "sha512-2ROobfnYWxAZlDKB3lYdo6V7utX96d43HRX3hU0BG5T6gglBwNnvDGClpmxOqwtP/uhf1fk+BVSSsjtiUWX3vg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.14.tgz", - "integrity": "sha512-fGrJ589tU+AKoxf+kaRrEw7wlSfVr1/z/Fz625ggFCc6ySQEityKW3JsnLfNkh5qGrdxib4BOfF78f9J7Pyk+w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.1.tgz", + "integrity": "sha512-NBbJOynLOeMsPo03+3dfdxE0P7SB7SXRqoFJ7WP2sOgOIxODna/huo2blmRlnZAVPTn1iQEB9Q+UeyP5c4/1+w==", "requires": { + "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.3.14.tgz", - "integrity": "sha512-3Jvi60WzLUe6jQJEw1xi/35uW7ynzxOS7iyZlwYfl2v8RljeLyyQsm0WNVpq6tXt80ppDeD59JvYTguEQ283Og==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.1.tgz", + "integrity": "sha512-Nniqe8X5mTIm37u46HDXCEDuYIv+G5nJZuz1BwuSyDgqxCmdJ3asdgkxgkRQW8NUjXmj6/2vWJ3gn/by4VcKEA==", "dev": true }, "@angular/platform-browser": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.14.tgz", - "integrity": "sha512-Lviz9GfsIyOIBDal8QhIBKU8OMH29A0RhFw2opTC50sqKadXLN9CD7iSaAwQbNLc4mc3JAF4zth0AzKdHLbz7Q==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.1.tgz", + "integrity": "sha512-d6liZjPz29GUZ6dhxytFL/W2nMsYwPpc/E/vZpr5yV+u+gI2VjbnLbl8SG+jjj0/Hyq7s4aGhEKsRrCJJMXgNw==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.14.tgz", - "integrity": "sha512-g9z/g8gIOrBCX1SQ/GWwB0+JXBC6CKe0+yRyy9GGeBLm/YXWZHxTkmnDmueXXfPtUl8TOAInE22wlLcfunWTrg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.1.tgz", + "integrity": "sha512-lawT3bdjXZVmVNXVoPS0UiB8Qxw5jEYXHx2m38JvHGv7/pl0Sgr+wa6f+/4pvTwu3VZb/8ohkVdFicPfrU21Jw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "20.3.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.14.tgz", - "integrity": "sha512-gi7/NuHRS9n9RCwh03VuVFizVMa2lKL/s+7yP3Ecq2nQ5uSeTMWb/91OmGEBwncI3wKPkYdQ9g3n6PvK/O8uDQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.1.tgz", + "integrity": "sha512-3ypbtH3KfzuVgebdEET9+bRwn1VzP//KI0tIqleCGi4rblP3WQ/HwIGa5Qhdcxmw/kbmABKLRXX2kRUvidKs/Q==", "requires": { "tslib": "^2.3.0" } }, + "@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, "@appsignal/javascript": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.6.1.tgz", @@ -24795,36 +27110,45 @@ "@appsignal/javascript": "=1.6.1" } }, - "@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "@authress/login": { + "version": "2.6.417", + "resolved": "https://registry.npmjs.org/@authress/login/-/login-2.6.417.tgz", + "integrity": "sha512-3iMjpwnU3iWTpVjS5nc1/7QrIresFS+TKN43R9UtV/khW2liyq9CPyX5ZCjZ74TWEXOckhTwqy9s7VpHlZ8TWw==", "requires": { - "@babel/helper-validator-identifier": "^7.27.1", + "cookie": "<1", + "lodash.take": "^4.1.1" + } + }, + "@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==" }, "@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "requires": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -24845,12 +27169,12 @@ } }, "@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "requires": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -24866,11 +27190,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "requires": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -24885,17 +27209,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "dependencies": { @@ -24908,13 +27232,13 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "dependencies": { @@ -24940,9 +27264,9 @@ }, "dependencies": { "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "requires": { "ms": "^2.1.3" @@ -24956,32 +27280,32 @@ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" }, "@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" } }, "@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "requires": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" } }, "@babel/helper-optimise-call-expression": { @@ -24994,9 +27318,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -25011,14 +27335,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -25046,9 +27370,9 @@ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" }, "@babel/helper-validator-option": { "version": "7.27.1", @@ -25056,41 +27380,41 @@ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" }, "@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "requires": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "requires": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "requires": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.6" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-bugfix-safari-class-field-initializer-scope": { @@ -25123,13 +27447,13 @@ } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" } }, "@babel/plugin-proposal-private-property-in-object": { @@ -25139,21 +27463,21 @@ "dev": true }, "@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-syntax-unicode-sets-regex": { @@ -25207,76 +27531,76 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" } }, "@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-duplicate-keys": { @@ -25289,13 +27613,13 @@ } }, "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-dynamic-import": { @@ -25308,22 +27632,22 @@ } }, "@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-export-namespace-from": { @@ -25357,12 +27681,12 @@ } }, "@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-literals": { @@ -25375,12 +27699,12 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-member-expression-literals": { @@ -25403,25 +27727,25 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-transform-modules-umd": { @@ -25454,34 +27778,34 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" } }, "@babel/plugin-transform-object-super": { @@ -25495,21 +27819,21 @@ } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, @@ -25523,24 +27847,24 @@ } }, "@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-property-literals": { @@ -25553,22 +27877,22 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-reserved-words": { @@ -25581,9 +27905,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", - "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.27.1", @@ -25612,12 +27936,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, @@ -25658,13 +27982,13 @@ } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/plugin-transform-unicode-regex": { @@ -25678,26 +28002,26 @@ } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" } }, "@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "requires": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -25710,42 +28034,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -25785,41 +28109,63 @@ } }, "@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==" + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" + }, + "@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "requires": { + "core-js-pure": "^3.43.0" + } }, "@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" + }, + "dependencies": { + "@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "requires": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + } } }, "@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "requires": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" } }, "@blocknote/core": { @@ -25951,11 +28297,36 @@ "resolved": "https://registry.npmjs.org/@datorama/akita/-/akita-8.0.1.tgz", "integrity": "sha512-0VnPWd+Sy3ColhzjDSBNcEnzAQtbezk6bYmJHvPaLMK5Ysl90KcNls2bE4sj5vaLeGLjhMtqtfp/RgrigPXDxA==" }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true + "@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } }, "@emoji-mart/data": { "version": "1.2.1", @@ -25981,200 +28352,200 @@ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "dev": true, "optional": true }, "@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "dev": true, "optional": true }, "@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "dev": true, "optional": true }, "@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "dev": true, "optional": true }, "@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "requires": { "eslint-visitor-keys": "^3.4.3" } }, "@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true }, "@eslint/config-array": { @@ -26206,10 +28577,20 @@ "@types/json-schema": "^7.0.15" } }, + "@eslint/css-tree": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.8.tgz", + "integrity": "sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==", + "dev": true, + "requires": { + "mdn-data": "2.23.0", + "source-map-js": "^1.0.1" + } + }, "@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -26218,7 +28599,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -26235,6 +28616,23 @@ "uri-js": "^4.2.2" } }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + } + }, "globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -26250,9 +28648,9 @@ } }, "@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true }, "@eslint/object-schema": { @@ -26317,9 +28715,9 @@ "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==" }, "@fullcalendar/angular": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.19.tgz", - "integrity": "sha512-a3TmjKnF8xprH1aNgFn9zYehEhM4GBAyh+91SJymno2j1cE8D8z0+W1HNwtDekKWwJt/5YoinCvDTHydmF/kKw==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.20.tgz", + "integrity": "sha512-/V5wZuZSzWZxD3dnVteqY844Onv6we5ah0RU9ZJdRIeNbBFknHLeVYpIjYKsAPwkGigYX7UGOJR6NNpyarBLlQ==", "requires": { "tslib": "^2.3.0" } @@ -26333,49 +28731,49 @@ } }, "@fullcalendar/core": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.19.tgz", - "integrity": "sha512-z0aVlO5e4Wah6p6mouM0UEqtRf1MZZPt4mwzEyU6kusaNL+dlWQgAasF2cK23hwT4cmxkEmr4inULXgpyeExdQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.20.tgz", + "integrity": "sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==", "requires": { "preact": "~10.12.1" } }, "@fullcalendar/daygrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.19.tgz", - "integrity": "sha512-IAAfnMICnVWPjpT4zi87i3FEw0xxSza0avqY/HedKEz+l5MTBYvCDPOWDATpzXoLut3aACsjktIyw9thvIcRYQ==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.20.tgz", + "integrity": "sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==" }, "@fullcalendar/interaction": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.19.tgz", - "integrity": "sha512-GOciy79xe8JMVp+1evAU3ytdwN/7tv35t5i1vFkifiuWcQMLC/JnLg/RA2s4sYmQwoYhTw/p4GLcP0gO5B3X5w==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.20.tgz", + "integrity": "sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==" }, "@fullcalendar/list": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.19.tgz", - "integrity": "sha512-knZHpAVF0LbzZpSJSUmLUUzF0XlU/MRGK+Py2s0/mP93bCtno1k2L3XPs/kzh528hSjehwLm89RgKTSfW1P6cA==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.20.tgz", + "integrity": "sha512-7Hzkbb7uuSqrXwTyD0Ld/7SwWNxPD6SlU548vtkIpH55rZ4qquwtwYdMPgorHos5OynHA4OUrZNcH51CjrCf2g==" }, "@fullcalendar/moment": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-6.1.19.tgz", - "integrity": "sha512-wpP0yXSGPDFoY0P3BA6Nw35q/x9TNbnvkwVyu7qgaewepO2Ss10E1yNVM4EtDl82T5IDRcgmFSQ48z1vGcGe1g==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-6.1.20.tgz", + "integrity": "sha512-GS6gY/LKu/65TiRSW6qUJFW9SPYGkPERyOOJMrCHeoOP4sE8Ewl7g0N1H4S6HHFHDrI40T0x2bYAiPEhYZpIJA==" }, "@fullcalendar/moment-timezone": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-6.1.19.tgz", - "integrity": "sha512-6UOhMThdzDnh10/SPW5t5zmNq+betGebK3i7ytg2EHzlEb2EztfHJC5mbqEU2B2AoKNr2FUIonWuergYe7OVhA==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-6.1.20.tgz", + "integrity": "sha512-fGk3bQU4hf0rgw3Zd/PH6Ok0Db+s9/nsuALj3IG8GYFqInwLsHZI0Qc+ljN8jv9LrLS5sOBBOZHWDg2ncx1inw==" }, "@fullcalendar/premium-common": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.19.tgz", - "integrity": "sha512-bOWHm1u1dUy6M4fQ0hNK7qEI7SrVWrN1ovv/z4/FE/ybfM19ukz7SFs907Ur7KUBWLNKTQYXBtdrY/ginwWraw==" + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.20.tgz", + "integrity": "sha512-rT+AitNnRyZuFEtYvsB1OJ2g1Bq2jmTR6qdn/dEU6LwkIj/4L499goLtMOena/JyJ31VBztdHrccX//36QrY3w==" }, "@fullcalendar/resource": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.19.tgz", - "integrity": "sha512-br1ylX/aIOfd8m7Tzl2LpJBSI+N9Q6aS1qw7K9qnQjYXWQyHBlfLG6ZcPmmkjfaqTUJc8ARRbtNWj1ts5qOZgQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.20.tgz", + "integrity": "sha512-vpQs1eYJbc1zGOzF3obVVr+XsHTMTG7STKVQBEGy3AeFgfosRkUz+3DUawmy98vSjJUYOAQHO+pWW0ek0n5g0w==", "requires": { - "@fullcalendar/premium-common": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20" } }, "@fullcalendar/resource-common": { @@ -26400,38 +28798,38 @@ } }, "@fullcalendar/resource-timeline": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.19.tgz", - "integrity": "sha512-oC3aVR++dLqJNeBwmLHq9sDgRDFfIG0qSteV7bgBekvNlqEMqXx8wPjUxnELrq8rrhMmK4iV3wO7AB/48IVgyg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.20.tgz", + "integrity": "sha512-HAlM/I+9xJPzZx3Wry7l5oibc8n5Pv/iL8tp2dxUu/0zqS0UqADbHItJucuANfDDeL7PEbCbh/uFx9VvzRUIkQ==", "requires": { - "@fullcalendar/premium-common": "~6.1.19", - "@fullcalendar/scrollgrid": "~6.1.19", - "@fullcalendar/timeline": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20", + "@fullcalendar/scrollgrid": "~6.1.20", + "@fullcalendar/timeline": "~6.1.20" } }, "@fullcalendar/scrollgrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.19.tgz", - "integrity": "sha512-S1pbiYHvmV0ep6z5sWXJQfgW4Y/jrS5iLIAqSagDFPK0jr327nBxl7Ryi3Zb5UdMIP0/O4GXs8jwZabQPd8SOg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.20.tgz", + "integrity": "sha512-M55m0hxpou4IPObto5f0nVcXvIj3rkSTba0ypclSFDwBz3JxuCPS6l8kaUznqlZCr2Ld/HFJr+jwyvY070AafQ==", "requires": { - "@fullcalendar/premium-common": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20" } }, "@fullcalendar/timegrid": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.19.tgz", - "integrity": "sha512-OuzpUueyO9wB5OZ8rs7TWIoqvu4v3yEqdDxZ2VcsMldCpYJRiOe7yHWKr4ap5Tb0fs7Rjbserc/b6Nt7ol6BRg==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.20.tgz", + "integrity": "sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==", "requires": { - "@fullcalendar/daygrid": "~6.1.19" + "@fullcalendar/daygrid": "~6.1.20" } }, "@fullcalendar/timeline": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.19.tgz", - "integrity": "sha512-d2P961mnUTXtJeWNmIq1neoDmZcrPUaK7nGFoc+jQAlnmG3aNSVWQmD1ia694AMqLWtcWkwipW9MuaJgx2QvrA==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.20.tgz", + "integrity": "sha512-yhTgMNDWfB+XqEUTLWrpPjM4fcvGYLOA9DvTp1ysdeqhRGoZnRK9Iv2WW5BaKT+VXhXoAPrj2Ud/lXt6youWAQ==", "requires": { - "@fullcalendar/premium-common": "~6.1.19", - "@fullcalendar/scrollgrid": "~6.1.19" + "@fullcalendar/premium-common": "~6.1.20", + "@fullcalendar/scrollgrid": "~6.1.20" } }, "@github/auto-check-element": { @@ -26515,24 +28913,29 @@ } }, "@hocuspocus/common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.0.tgz", - "integrity": "sha512-vN0kE/mGTjuwchq16naq+nEjFDmeSLNCkDSAB7DKvpZnuG4KQi5oC42VFdKbq/baQTbDMSe82rI7f9riOR8idQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz", + "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==", "requires": { "lib0": "^0.2.87" } }, "@hocuspocus/provider": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.0.tgz", - "integrity": "sha512-SXiHk4I2n1BqX1KuXgNDHpgMXseWbCIsaXT/lGaFq+qCF5F92cAmIg4mUPUQ39L1ugKM6Hm7tX33X+Jsk7466g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.4.tgz", + "integrity": "sha512-KbsMAfdYcIJD8eMU/5QnpXcSOvIWAcCNI33FSRSaKCIpYBFtAwkYIwWnZJmPZ8a1BMAtqQc+uvy9+UQf7GHnGQ==", "requires": { - "@hocuspocus/common": "^3.4.0", + "@hocuspocus/common": "^3.4.4", "@lifeomic/attempt": "^3.0.2", "lib0": "^0.2.87", "ws": "^8.17.1" } }, + "@hono/node-server": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", + "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==" + }, "@hotwired/stimulus": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz", @@ -26553,54 +28956,57 @@ } }, "@html-eslint/eslint-plugin": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.49.0.tgz", - "integrity": "sha512-+a1XZnp/gWer4CLd6hgR/dC9R3ew4ozSag4J4KSlHB4haYiCtOcT1vnIFDnqs9bWsJhROtjFHkGwRYsyPH76XA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.54.0.tgz", + "integrity": "sha512-9sXFPCiLL+PtppXUJoZZ9GjnaCck+oH+YwN4ZJZ4TC22vaMKVuuEuscxaGLwh6EdWFbKslrc9hlKiMAMJKoFdw==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/parser": "^0.49.0", - "@html-eslint/template-parser": "^0.49.0", - "@html-eslint/template-syntax-parser": "^0.49.0", - "@html-eslint/types": "^0.49.0" + "@html-eslint/parser": "^0.54.0", + "@html-eslint/template-parser": "^0.54.0", + "@html-eslint/template-syntax-parser": "^0.54.0", + "@html-eslint/types": "^0.54.0" } }, "@html-eslint/parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.49.0.tgz", - "integrity": "sha512-moB2CWd8kSiOqp+ibT4awHx7pw1irkON5GwiXP0JlHRHAGIll18lBuHKtY9K/vkok97Pq1zjoyl5T7Z+fFtufQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.54.0.tgz", + "integrity": "sha512-ia3I/6jf87679pUrhIDKSgddKbw9GLkvO86fYt7tJQHHRQu+zySErIxuI2b941oeovzOq10dTpC5Hp41qbvPgg==", "dev": true, "requires": { - "@html-eslint/template-syntax-parser": "^0.49.0", - "@html-eslint/types": "^0.49.0", + "@eslint/css-tree": "^3.6.8", + "@html-eslint/template-syntax-parser": "^0.54.0", + "@html-eslint/types": "^0.54.0", + "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.49.0.tgz", - "integrity": "sha512-ciW0BFcW1iTqpT+aQOfjCelwcjLpqQMx/iLGevDQv8QHBdT43J89aAGPbv140KnYgUhQPnu9hFUV3goXWSu+gA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.54.0.tgz", + "integrity": "sha512-gSjgmGwRQehNxZ3XdRUhUoXDFzYc/LYoKA7JwExjdvklGnSh5WkH/CLOlphkDh9jJsC1O/E0I04bVGrzy3idKQ==", "dev": true, "requires": { - "@html-eslint/types": "^0.49.0", + "@html-eslint/types": "^0.54.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-syntax-parser": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.49.0.tgz", - "integrity": "sha512-TSW1gWU+cfYX47OVXtNoY+r7ALoY+87q3jkPrfGuccy5ODNfUR62jaH2lCfdMwGW+C6jhEzc83Uiije89UI72Q==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.54.0.tgz", + "integrity": "sha512-7mDM4AWqz42FHwnOt8Lu5xqovaZHlEuBrmwNrMg6VwC9TPaLVyh4j3zNzNnM6tjftaXZzverJup39zGB8mvXjg==", "dev": true, "requires": { - "@html-eslint/types": "^0.49.0" + "@html-eslint/types": "^0.54.0" } }, "@html-eslint/types": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.49.0.tgz", - "integrity": "sha512-7d+jT37S47xZYXm7P6c5gTxGoYP8KqavpT1dh3VUWmoQBAButHrO4o56TZWZHJUP3GBkafOt7dE0wTQFflukiw==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.54.0.tgz", + "integrity": "sha512-bfJolxay0POMYaFWTCH1MBitEaxIEKZOoROGOLZiRBaPvQrzhwYQktuyt5X1PcHqUB4HwEtYgSdpjYGT4JbrvA==", "dev": true, "requires": { + "@types/css-tree": "^2.3.11", "@types/estree": "^1.0.6", "es-html-parser": "0.3.1", "eslint": "^9.39.1" @@ -26613,21 +29019,13 @@ "dev": true }, "@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "requires": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "dependencies": { - "@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true - } + "@humanwhocodes/retry": "^0.4.0" } }, "@humanwhocodes/module-importer": { @@ -26642,51 +29040,47 @@ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true }, + "@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==" + }, "@inquirer/checkbox": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.1.tgz", - "integrity": "sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" } }, "@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", - "dev": true, + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" } }, "@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "requires": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -26705,38 +29099,38 @@ } }, "@inquirer/editor": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", - "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" } }, "@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" } }, "@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "requires": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "dependencies": { "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -26744,103 +29138,92 @@ } }, "@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==" + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==" }, "@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" } }, "@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" } }, "@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" } }, "@inquirer/prompts": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", - "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "requires": { - "@inquirer/checkbox": "^4.2.1", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.17", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" - }, - "dependencies": { - "@inquirer/confirm": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.15.tgz", - "integrity": "sha512-SwHMGa8Z47LawQN0rog0sT+6JpiL0B7eW9p1Bb7iCeKDGTI5Ez25TSc2l8kw52VV7hA4sX/C78CGkMrKXfuspA==", - "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - } - } + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" } }, "@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" } }, "@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" } }, "@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "requires": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" } }, "@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==" }, "@isaacs/balanced-match": { "version": "4.0.1", @@ -26855,59 +29238,6 @@ "@isaacs/balanced-match": "^4.0.1" } }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, "@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -26931,6 +29261,15 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -26947,9 +29286,9 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { "version": "0.3.29", @@ -26986,34 +29325,69 @@ } } }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, "@jsonjoy.com/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true }, + "@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true + }, + "@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true + }, "@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, "requires": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + } + }, + "@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "requires": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" } }, "@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "requires": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + } }, "@knowledgecode/delegate": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@knowledgecode/delegate/-/delegate-0.8.5.tgz", - "integrity": "sha512-Wuv1m5t170SWW6R60zgOKg14s230buKfrd8tjpmeG/lKBFcYjQSvZoOZh34isygkvJkBHY2ozdg2E3rzJy3Ehg==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@knowledgecode/delegate/-/delegate-0.10.0.tgz", + "integrity": "sha512-bu6T27FlgX+rZY6xKGvM7M6dPXtSaHTj/RpFXoD7bkFths3hn/dqg84uqQWSJTGFljeBBjyzdAlI9eSV0bI1HA==" }, "@kolkov/ngx-gallery": { "version": "2.0.1", @@ -27040,11 +29414,11 @@ "integrity": "sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==" }, "@listr2/prompt-adapter-inquirer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", - "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", + "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", "requires": { - "@inquirer/type": "^3.0.7" + "@inquirer/type": "^3.0.8" } }, "@lit-labs/ssr-dom-shim": { @@ -27052,52 +29426,60 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" }, + "@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "requires": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, "@lmdb/lmdb-darwin-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", - "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.4.tgz", + "integrity": "sha512-XaKL705gDWd6XVls3ATDj13ZdML/LqSIxwgnYpG8xTzH2ifArx8fMMDdvqGE/Emd+W6R90W2fveZcJ0AyS8Y0w==", "dev": true, "optional": true }, "@lmdb/lmdb-darwin-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", - "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.4.tgz", + "integrity": "sha512-GPHGEVcwJlkD01GmIr7B4kvbIcUDS2+kBadVEd7lU4can1RZaZQLDDBJRrrNfS2Kavvl0VLI/cMv7UASAXGrww==", "dev": true, "optional": true }, "@lmdb/lmdb-linux-arm": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", - "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.4.tgz", + "integrity": "sha512-cmev5/dZr5ACKri9f6GU6lZCXTjMhV72xujlbOhFCgFXrt4W0TxGsmY8kA1BITvH60JBKE50cSxsiulybAbrrw==", "dev": true, "optional": true }, "@lmdb/lmdb-linux-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", - "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.4.tgz", + "integrity": "sha512-mALqr7DE42HsiwVTKpQWxacjHoJk+e9p00RWIJqTACh/hpucxp/0lK/XMh5XzWnU/TDCZLukq1+vNqnNumTP/Q==", "dev": true, "optional": true }, "@lmdb/lmdb-linux-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", - "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.4.tgz", + "integrity": "sha512-QjLs8OcmCNcraAcLoZyFlo0atzBJniQLLwhtR+ymQqS5kLYpV5RqwriL87BW+ZiR9ZiGgZx3evrz5vnWPtJ1fQ==", "dev": true, "optional": true }, "@lmdb/lmdb-win32-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", - "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.4.tgz", + "integrity": "sha512-tr/pwHDlZ33forLGAr0tI04cRmP4SgF93yHbb+2zvZiDEyln5yMHhbKDySxY66aUOkhvBvTuHq9q/3YmTj6ZHQ==", "dev": true, "optional": true }, "@lmdb/lmdb-win32-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", - "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.4.tgz", + "integrity": "sha512-KRzfocJzB/mgoTCqnMawuLSKheHRVTqWfSmouIgYpFs6Hx4zvZSvsZKSCEb5gHmICy7qsx9l06jk3MFTtiFVAQ==", "dev": true, "optional": true }, @@ -27193,9 +29575,9 @@ "integrity": "sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==" }, "@mantine/core": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.7.tgz", - "integrity": "sha512-7gUTiUrD0pukpkSNvScGi/e+pBuBWYJP5yFHT4TFf1fmaQAA7PbNoAzUeEkPbVromDtK0VdEcpRlYpDnJhpz2g==", + "version": "8.3.12", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.12.tgz", + "integrity": "sha512-bDEoUl4SneltfI1GeEaBk6BVDbLuB/w15YwseAmUvc8ldAbNcsVhxKxY/BdhwqUo6O3L2vhdlb3WwxR1y8741g==", "requires": { "@floating-ui/react": "^0.27.16", "clsx": "^2.1.1", @@ -27229,11 +29611,13 @@ "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" }, "@modelcontextprotocol/sdk": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", - "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", + "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", "requires": { - "ajv": "^6.12.6", + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", @@ -27241,10 +29625,12 @@ "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" }, "dependencies": { "accepts": { @@ -27256,21 +29642,18 @@ "negotiator": "^1.0.0" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ajv": "^8.0.0" } }, "body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "requires": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -27278,18 +29661,15 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", + "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "requires": { - "safe-buffer": "5.2.1" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==" }, "cookie-signature": { "version": "1.2.2", @@ -27345,9 +29725,9 @@ } }, "finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "requires": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -27375,18 +29755,13 @@ } }, "iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -27403,9 +29778,9 @@ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" }, "mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "requires": { "mime-db": "^1.54.0" } @@ -27415,14 +29790,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" }, - "qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "requires": { - "side-channel": "^1.1.0" - } - }, "raw-body": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", @@ -27434,33 +29801,28 @@ "unpipe": "~1.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, "send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "requires": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" } }, "serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "requires": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -27672,6 +30034,18 @@ "dev": true, "optional": true }, + "@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + } + }, "@ng-select/ng-option-highlight": { "version": "20.6.3", "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-20.6.3.tgz", @@ -27697,77 +30071,51 @@ } }, "@ngtools/webpack": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.12.tgz", - "integrity": "sha512-ePuofHOtbgvEq2t+hcmL30s4q9HQ/nv9ABwpLiELdVIObcWUnrnizAvM7hujve/9CQL6gRCeEkxPLPS4ZrK9AQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.1.tgz", + "integrity": "sha512-8ySRsb1xgr+7XQmZ2LJ+AhFe1IZKW93wfL6OMpZtcWU4FzxWa/NhlfSNBQI5kuyPEVDDAxJ4RI5IoQyvcOmNLg==", "dev": true }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, "@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "requires": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", + "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "dependencies": { "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==" } } }, "@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "requires": { "semver": "^7.3.5" } }, "@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.1.tgz", + "integrity": "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==", "requires": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "dependencies": { "isexe": { @@ -27776,14 +30124,14 @@ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" }, "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==" }, "which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "requires": { "isexe": "^3.1.1" } @@ -27791,70 +30139,39 @@ } }, "@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "requires": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" } }, "@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==" }, "@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", + "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", "requires": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "requires": { - "brace-expansion": "^2.0.1" - } - } } }, "@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "requires": { - "which": "^5.0.0" + "which": "^6.0.0" }, "dependencies": { "isexe": { @@ -27863,9 +30180,9 @@ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" }, "which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "requires": { "isexe": "^3.1.1" } @@ -27873,21 +30190,21 @@ } }, "@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==" }, "@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", + "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", "requires": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "dependencies": { "isexe": { @@ -27896,9 +30213,9 @@ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" }, "which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "requires": { "isexe": "^3.1.1" } @@ -27919,9 +30236,9 @@ } }, "@openproject/primer-view-components": { - "version": "0.79.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.79.1.tgz", - "integrity": "sha512-8VBJB/+BdnvYSWA46XnLhUyE2PNf/fvdBQiPCa03bWkkP8VChEIb4hrMB51Df1LmqoaV4WWjeIJlGYCxokXi/Q==", + "version": "0.80.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.80.2.tgz", + "integrity": "sha512-ttQM5K+VRvMsxGH7HIG8QFTBw5xeIsBmvYOknQwhtNtNkj0j+fWU19osL982m/jy45evgEo0eQ/FIdEWywfrlg==", "requires": { "@github/auto-check-element": "^6.0.0", "@github/auto-complete-element": "^3.8.0", @@ -27946,6 +30263,12 @@ "rxjs": "^7.8.0" } }, + "@oxc-project/types": { + "version": "0.106.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.106.0.tgz", + "integrity": "sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==", + "dev": true + }, "@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", @@ -28079,27 +30402,15 @@ "dev": true, "optional": true }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, "@primer/behaviors": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" }, "@primer/css": { - "version": "22.0.2", - "resolved": "https://registry.npmjs.org/@primer/css/-/css-22.0.2.tgz", - "integrity": "sha512-FfXd1ga05oewKjDRi9cPmy7BSnb/6QOjTIxAtDj94Hoyk+qJxHhgvhbcnZwBfL3WKP6HeUT3PnsT9k+43Bmg3Q==" + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@primer/css/-/css-22.1.0.tgz", + "integrity": "sha512-Nwg9QaRiBeu0BU6h+Su0X07daihX1obiuqGRG8y+SexOnvWhN2J5n4OFAvGfQsit07Y7Q6gGoK+yVU5tb8CtDA==" }, "@primer/live-region-element": { "version": "0.8.0", @@ -28115,14 +30426,14 @@ "integrity": "sha512-KMWYYEIDKNIY0N3fMmNGPWJGHgoJF5NHkJllpOM3upDXuLtAe26Riogp1cfYdhp+sVjGZMt32DxcUhTX7ZhLOQ==" }, "@primer/primitives": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.1.tgz", - "integrity": "sha512-f5FXeUHQ0iyxt1UF6MqeajQ9jRV/7uOGLECU5KuFWhMioCZOho09jS6alZA9tiwksHr2LYXfo7AdFczpEz3Npw==" + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.3.2.tgz", + "integrity": "sha512-/8EDh3MmF9cbmrLETFmIuNFIdvpSCkvBlx6zzD8AZ4dZ5UYExQzFj8QAtIrRtCFJ2ZmW5QrtrPR3+JVb8KEDpg==" }, "@primer/view-components": { - "version": "npm:@openproject/primer-view-components@0.79.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.79.1.tgz", - "integrity": "sha512-8VBJB/+BdnvYSWA46XnLhUyE2PNf/fvdBQiPCa03bWkkP8VChEIb4hrMB51Df1LmqoaV4WWjeIJlGYCxokXi/Q==", + "version": "npm:@openproject/primer-view-components@0.80.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.80.2.tgz", + "integrity": "sha512-ttQM5K+VRvMsxGH7HIG8QFTBw5xeIsBmvYOknQwhtNtNkj0j+fWU19osL982m/jy45evgEo0eQ/FIdEWywfrlg==", "requires": { "@github/auto-check-element": "^6.0.0", "@github/auto-complete-element": "^3.8.0", @@ -28163,166 +30474,287 @@ "integrity": "sha512-ybBsUrIsu5geM8BtqnpM7ZA9D8uzSz+e1B4JR57NaCmasHKWap6AX5DT7NHIbp21opVet1qqoVSdsoLDqXeB2A==" }, "@rails/request.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.12.tgz", - "integrity": "sha512-g3//JBja1s04Zflj7IoMLQuXza9i4ZvtLmm0r0dMwh1QQUs6rL2iKUOGGyERfLsd81SnXC5ucfVV//rtsDlEEA==" + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.13.tgz", + "integrity": "sha512-7MXmjFOPuaxpjG8brqKJG0EfIe9ak6R0wRnjCBtRuADNFbdlRxETdKx1T5NVU4Ato3iZOkEpeSUEuLboL3tCGA==" }, "@remirror/core-constants": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==" }, + "@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==", + "dev": true, + "optional": true + }, + "@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==", + "dev": true, + "optional": true + }, + "@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.58.tgz", + "integrity": "sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==", + "dev": true, + "optional": true + }, + "@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.58.tgz", + "integrity": "sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.58.tgz", + "integrity": "sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.58.tgz", + "integrity": "sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.58.tgz", + "integrity": "sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.58.tgz", + "integrity": "sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.58.tgz", + "integrity": "sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==", + "dev": true, + "optional": true + }, + "@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.58.tgz", + "integrity": "sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==", + "dev": true, + "optional": true + }, + "@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.58.tgz", + "integrity": "sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==", + "dev": true, + "optional": true, + "requires": { + "@napi-rs/wasm-runtime": "^1.1.1" + } + }, + "@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.58.tgz", + "integrity": "sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==", + "dev": true, + "optional": true + }, + "@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.58.tgz", + "integrity": "sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==", + "dev": true, + "optional": true + }, + "@rolldown/pluginutils": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.58.tgz", + "integrity": "sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==", + "dev": true + }, "@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", "dev": true, "optional": true }, "@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", "dev": true, "optional": true }, "@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", "dev": true, "optional": true }, "@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", "dev": true, "optional": true }, @@ -28333,13 +30765,118 @@ "dev": true }, "@schematics/angular": { - "version": "20.3.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.12.tgz", - "integrity": "sha512-ikl+nkWUab/Z4eSkBHgq9FLIUH8qh4OcYKeBQ0fyWqIUFHyjjK0JOfwmH1g/3zAmuUMtkthHCehAtyKzCTQjVA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.1.tgz", + "integrity": "sha512-WijqITteakpFOplx7IGHIdBOdTU04Ul4qweilY1CRK3KdzQRuAf31KiKUFrJiGW076cyokmAQmBoZcngh9rCNw==", "requires": { - "@angular-devkit/core": "20.3.12", - "@angular-devkit/schematics": "20.3.12", + "@angular-devkit/core": "21.1.1", + "@angular-devkit/schematics": "21.1.1", "jsonc-parser": "3.3.1" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.1.tgz", + "integrity": "sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==", + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "@angular-devkit/schematics": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.1.tgz", + "integrity": "sha512-3ptEOuALghEYEPVbhRa7g8a+YmvmHqHVNqF9XqCbG22nPGWkE58qfNNbXi3tF9iQxzKSGw5Iy5gYUvSvpsdcfw==", + "requires": { + "@angular-devkit/core": "21.1.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.0.0", + "rxjs": "7.8.2" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + }, + "cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==" + }, + "log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "requires": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + } + }, + "magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "requires": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + }, + "string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "requires": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "@shikijs/types": { @@ -28357,53 +30894,53 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" }, "@sigstore/bundle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", - "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "requires": { - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/protobuf-specs": "^0.5.0" } }, "@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", + "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==" }, "@sigstore/protobuf-specs": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", - "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==" }, "@sigstore/sign": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", - "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", + "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", "requires": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" } }, "@sigstore/tuf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", - "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", + "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", "requires": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" } }, "@sigstore/verify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", - "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "requires": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" } }, "@socket.io/component-emitter": { @@ -28412,6 +30949,11 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, + "@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" + }, "@stimulus-components/auto-submit": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@stimulus-components/auto-submit/-/auto-submit-6.0.0.tgz", @@ -28423,23 +30965,23 @@ "integrity": "sha512-0ShvvDiG4qNLyFUTDrjGiR9MWR6D9EiAJRUSKxTPHA5Cc2Ci/A4Qj7cHDCoK2ZGHhpESfK0LsR9xtySCN6FTQw==" }, "@stylistic/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.46.1", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.52.0", + "eslint-visitor-keys": "^5.0.0", + "espree": "^11.0.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "dependencies": { "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true }, "picomatch": { @@ -28538,9 +31080,9 @@ "integrity": "sha512-Woh/nk1/7c31D14dIaU5i9d4NMK06TBeEA+uBidhZp+JAXVGMeQGm0K2iJxBXNvNrc6aKGlZ57W1o3CPUWOlWQ==" }, "@tiptap/extensions": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.11.0.tgz", - "integrity": "sha512-g43beA73ZMLezez1st9LEwYrRHZ0FLzlsSlOZKk7sdmtHLmuqWHf4oyb0XAHol1HZIdGv104rYaGNgmQXr1ecQ==" + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.15.3.tgz", + "integrity": "sha512-ycx/BgxR4rc9tf3ZyTdI98Z19yKLFfqM3UN+v42ChuIwkzyr9zyp7kG8dB9xN2lNqrD+5y/HyJobz/VJ7T90gA==" }, "@tiptap/pm": { "version": "3.12.0", @@ -28609,32 +31151,34 @@ "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==" }, "@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "requires": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "minimatch": "^10.1.1" }, "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "requires": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" } } } }, + "@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, "@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -28697,6 +31241,12 @@ "@types/node": "*" } }, + "@types/css-tree": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@types/css-tree/-/css-tree-2.3.11.tgz", + "integrity": "sha512-aEokibJOI77uIlqoBOkVbaQGC9zII0A+JH1kcTNKW2CwyYWD8KM6qdo+4c77wD3wZOQfJuNWAr9M4hdk+YhDIg==", + "dev": true + }, "@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -28796,9 +31346,10 @@ } }, "@types/hotwired__turbo": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.4.tgz", - "integrity": "sha512-kgEKOms0taywPxPQvXUh90+G7M+phBHTiUw95Dosw0FU/we86iFerMfgBGcf3eQcAGs5pTNYnLMhiIlfRw/AfA==" + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.5.tgz", + "integrity": "sha512-lbbSGRg2QvyJJlF4LK4wVovQggUjLrMxpvgj66DFWt11GzdBBEjY2GQLoqFWfmc4AdBNPsSSw+l90DozZFtDfQ==", + "dev": true }, "@types/http-errors": { "version": "2.0.5", @@ -28816,9 +31367,9 @@ } }, "@types/jasmine": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.12.tgz", - "integrity": "sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-6.0.0.tgz", + "integrity": "sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==", "dev": true }, "@types/jquery": { @@ -28849,8 +31400,7 @@ "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "@types/json5": { "version": "0.0.29", @@ -28864,9 +31414,9 @@ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" }, "@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "dev": true }, "@types/markdown-it": { @@ -28942,9 +31492,9 @@ "dev": true }, "@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "version": "19.2.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", + "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", "dev": true, "requires": { "csstype": "^3.2.2" @@ -29079,92 +31629,90 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", - "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/type-utils": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" } }, "@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true }, "@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, @@ -29177,6 +31725,15 @@ "balanced-match": "^1.0.0" } }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, "eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -29201,128 +31758,149 @@ } }, "@typescript-eslint/parser": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", - "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } } }, "@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } } }, "@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true }, "@typescript-eslint/type-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", - "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" } }, "@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true }, "@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" } }, "@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, @@ -29335,6 +31913,15 @@ "balanced-match": "^1.0.0" } }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, "eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -29353,27 +31940,26 @@ } }, "@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "dependencies": { "brace-expansion": { @@ -29385,6 +31971,15 @@ "balanced-match": "^1.0.0" } }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -29397,24 +31992,119 @@ } }, "@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" + }, + "dependencies": { + "@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + } + }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "dev": true + }, + "@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "dev": true, + "requires": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + } + }, + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "dependencies": { @@ -29648,9 +32338,9 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==" }, "accepts": { "version": "1.3.8", @@ -29729,7 +32419,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "requires": { "ajv": "^8.0.0" } @@ -29741,114 +32430,179 @@ "dev": true }, "algoliasearch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", - "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.2.tgz", + "integrity": "sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==", "requires": { - "@algolia/abtesting": "1.1.0", - "@algolia/client-abtesting": "5.35.0", - "@algolia/client-analytics": "5.35.0", - "@algolia/client-common": "5.35.0", - "@algolia/client-insights": "5.35.0", - "@algolia/client-personalization": "5.35.0", - "@algolia/client-query-suggestions": "5.35.0", - "@algolia/client-search": "5.35.0", - "@algolia/ingestion": "1.35.0", - "@algolia/monitoring": "1.35.0", - "@algolia/recommend": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/abtesting": "1.12.2", + "@algolia/client-abtesting": "5.46.2", + "@algolia/client-analytics": "5.46.2", + "@algolia/client-common": "5.46.2", + "@algolia/client-insights": "5.46.2", + "@algolia/client-personalization": "5.46.2", + "@algolia/client-query-suggestions": "5.46.2", + "@algolia/client-search": "5.46.2", + "@algolia/ingestion": "1.46.2", + "@algolia/monitoring": "1.46.2", + "@algolia/recommend": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" } }, "angular-eslint": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.5.1.tgz", - "integrity": "sha512-7Vx2Vs4u5KO7Kxzo8kMAZnpubtHxK/wBWhBmHrKz/GRsrRQw2aIO13eCH6RU200EssNWpZ2OADIK0vlR9J0T0A==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.1.0.tgz", + "integrity": "sha512-qXpIEBNYpfgpBaFblnyFegVSQjWCVUdCXTHvMcvtNtmMgtPwIDKvG8wuJo5BbQ/MNt2d8npmnRUaS2ddzdCzww==", "dev": true, "requires": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/builder": "20.5.1", - "@angular-eslint/eslint-plugin": "20.5.1", - "@angular-eslint/eslint-plugin-template": "20.5.1", - "@angular-eslint/schematics": "20.5.1", - "@angular-eslint/template-parser": "20.5.1", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/builder": "21.1.0", + "@angular-eslint/eslint-plugin": "21.1.0", + "@angular-eslint/eslint-plugin-template": "21.1.0", + "@angular-eslint/schematics": "21.1.0", + "@angular-eslint/template-parser": "21.1.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "dependencies": { - "@angular-eslint/builder": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.5.1.tgz", - "integrity": "sha512-jUnqrMbMQ/UR8xPncg3NW3I18dlnV68V0HHozZgX3rjHuDOa7Yq4jwjFaaxfaId5KsNDoEGtjZCAz1lgw/+4Gw==", + "@angular-devkit/architect": { + "version": "0.2100.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2100.5.tgz", + "integrity": "sha512-KKmZMXzHCX0cWHY7xo9yy1J0fV7S/suhPO00YTcHBgLivkLsnbI177CrmWiMdLxSJD3NqTVkBEMPFQ2I2ooDFw==", "dev": true, "requires": { - "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", - "@angular-devkit/core": ">= 20.0.0 < 21.0.0" + "@angular-devkit/core": "21.0.5", + "rxjs": "7.8.2" + } + }, + "@angular-devkit/core": { + "version": "21.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", + "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", + "dev": true, + "requires": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + } + }, + "@angular-devkit/schematics": { + "version": "21.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.0.5.tgz", + "integrity": "sha512-U6Z/OEce3R9CJl8/xuVrNVp0uhv3Ac4wRjpG18kE0dh5R87ablhqr/wkP3rZbWpdGwuGSJ+cR7LE5IbwSswejA==", + "dev": true, + "requires": { + "@angular-devkit/core": "21.0.5", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.19", + "ora": "9.0.0", + "rxjs": "7.8.2" + } + }, + "@angular-eslint/builder": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.1.0.tgz", + "integrity": "sha512-pcUlDkGqeZ+oQC0oEjnkDDlB96gbgHQhnBUKdhYAiAOSuiBod4+npP0xQOq5chYtRNPBprhDqgrJrp5DBeDMOA==", + "dev": true, + "requires": { + "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0" } }, "@angular-eslint/bundled-angular-compiler": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.5.1.tgz", - "integrity": "sha512-0VroIEZzTBFB9B7Ws6xU5X3X9RoOSBVUcFbMs+UqfNoxHdZd5ToU5nwbImQg3hyFF0zdAjffoW3wW00qiC3L+g==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.1.0.tgz", + "integrity": "sha512-t52J6FszgEHaJ+IjuzU9qaWfVxsjlVNkAP+B5z2t4NDgbbDDsmI+QJh0OtP1qdlqzjh2pbocEml30KhYmNZm/Q==", "dev": true }, "@angular-eslint/eslint-plugin": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.5.1.tgz", - "integrity": "sha512-We7vkqRypa4+TPFMy1VSJkNSTIezRYbDS3YuzycNT5G6fhY3nn4WMa3ejsID/llcvptWyTKSZXZ/rJ+Zvo8xuQ==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.1.0.tgz", + "integrity": "sha512-oNp+4UzN2M3KwGwEw03NUdXz93vqJd9sMzTbGXWF9+KVfA2LjckGDTrI6g6asGcJMdyTo07rDcnw0m0MkLB5VA==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "@angular-eslint/utils": "20.5.1", + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "@angular-eslint/utils": "21.1.0", "ts-api-utils": "^2.1.0" } }, "@angular-eslint/eslint-plugin-template": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.5.1.tgz", - "integrity": "sha512-J3efFHXACo84vT80p4Jq/rKeI1NwWru7qe9U6hCZetKbXz0dGgcGgh4gN8lWGtCqw1Gsi+xzpEGiHS1BWDDvmA==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.1.0.tgz", + "integrity": "sha512-FlbRfOCn8IUHvP1ebcCSQFVNh+4X/HqZqL7SW5oj9WIYPiOX9ijS03ndNbfX/pBPSIi8GHLKMjLt8zIy1l5Lww==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "@angular-eslint/utils": "20.5.1", + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "@angular-eslint/utils": "21.1.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" } }, "@angular-eslint/schematics": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.5.1.tgz", - "integrity": "sha512-pPVbgiCCRDRKC2E3AeS0H3gC++azLarpYVTbOJS7vIGpmYqy++rKy5egXoECjHWQza/sXHJjUuHRpGhh/FN0og==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.1.0.tgz", + "integrity": "sha512-Hal1mYwx4MTjCcNHqfIlua31xrk2tZJoyTiXiGQ21cAeK4sFuY+9V7/8cxbwJMGftX0G4J7uhx8woOdIFuqiZw==", "dev": true, "requires": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/eslint-plugin": "20.5.1", - "@angular-eslint/eslint-plugin-template": "20.5.1", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/eslint-plugin": "21.1.0", + "@angular-eslint/eslint-plugin-template": "21.1.0", "ignore": "7.0.5", "semver": "7.7.3", "strip-json-comments": "3.1.1" } }, "@angular-eslint/template-parser": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.5.1.tgz", - "integrity": "sha512-XIXf5zt7AurD1kjSAoMadLLB7VGuwg4+ln4JHfPN9MYwcIqJGZMt0brBkkFV7ed2M4167uT03yyfyTK8Ijl6qA==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.1.0.tgz", + "integrity": "sha512-PYVgNbjNtuD5/QOuS6cHR8A7bRqsVqxtUUXGqdv76FYMAajQcAvyfR0QxOkqf3NmYxgNgO3hlUHWq0ILjVbcow==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "20.5.1", - "eslint-scope": "^8.0.2" + "@angular-eslint/bundled-angular-compiler": "21.1.0", + "eslint-scope": "^9.0.0" } }, - "@angular-eslint/utils": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.5.1.tgz", - "integrity": "sha512-6Zf9EBzW8eBTDxqgzBqKD4a9IH0uAVZFX9zgASipk8m5sO6YkjaS+auplmEac3ESzVCh9AzwNDFD68JAE0ugLQ==", + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "20.5.1" + "ajv": "^8.0.0" + } + }, + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true + }, + "cli-spinners": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", + "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", + "dev": true + }, + "eslint-scope": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.0.0.tgz", + "integrity": "sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, "ignore": { @@ -29857,11 +32611,66 @@ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "requires": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + } + }, + "magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dev": true, + "requires": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + } + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true + }, + "string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } } } }, @@ -29876,21 +32685,6 @@ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } - } - }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -29902,6 +32696,14 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -30068,14 +32870,13 @@ "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" }, "autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "requires": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" } @@ -30156,23 +32957,34 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, "baseline-browser-mapping": { - "version": "2.8.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", - "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==" + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==" }, "basic-auth": { "version": "1.1.0", @@ -30219,23 +33031,23 @@ "dev": true }, "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "requires": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -30247,11 +33059,30 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true } } }, @@ -30291,15 +33122,15 @@ } }, "browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "requires": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, "btoa": { @@ -30308,6 +33139,15 @@ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -30334,85 +33174,27 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "requires": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" - }, - "tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - } - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==" } } }, @@ -30446,6 +33228,11 @@ "get-intrinsic": "^1.3.0" } }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -30458,15 +33245,24 @@ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" }, "caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==" + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==" }, "ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -30483,9 +33279,9 @@ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" }, "chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" }, "chart.js": { "version": "4.5.1", @@ -30517,9 +33313,9 @@ } }, "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" }, "chrome-trace-event": { "version": "1.0.4", @@ -30538,41 +33334,36 @@ "cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true }, "cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "dependencies": { "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" }, "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "requires": { "ansi-regex": "^6.0.1" } @@ -30616,6 +33407,15 @@ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.20.tgz", "integrity": "sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==" }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -30629,6 +33429,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -30852,19 +33661,24 @@ } }, "core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==" + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==" }, "core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "requires": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" } }, + "core-js-pure": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", + "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==" + }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -30986,6 +33800,24 @@ "postcss-value-parser": "^4.0.2" } }, + "css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "requires": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "dependencies": { + "mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + } + } + }, "css-what": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", @@ -31061,12 +33893,6 @@ "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, "debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -31090,9 +33916,9 @@ "dev": true }, "default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, "requires": { "bundle-name": "^4.1.0", @@ -31150,9 +33976,9 @@ "dev": true }, "detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "optional": true }, @@ -31295,6 +34121,11 @@ "crossvent": "1.5.5" } }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" + }, "dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -31311,11 +34142,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -31331,9 +34157,9 @@ } }, "electron-to-chromium": { - "version": "1.5.240", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz", - "integrity": "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==" + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==" }, "emoji-mart": { "version": "5.6.0", @@ -31343,7 +34169,8 @@ "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "emojis-list": { "version": "3.0.0", @@ -31410,9 +34237,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -31456,9 +34283,9 @@ } }, "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -31567,9 +34394,9 @@ } }, "es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true }, "es-object-atoms": { @@ -31702,43 +34529,43 @@ } }, "esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "requires": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "esbuild-wasm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", - "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.27.2.tgz", + "integrity": "sha512-eUTnl8eh+v8UZIZh4MrMOKDAc8Lm7+NqP3pyuTORGFY1s/o9WoiJgKnwXy+te2J3hX7iRbFSHEyig7GsPeeJyw==", "dev": true }, "escalade": { @@ -31757,9 +34584,9 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.8.0", @@ -31768,7 +34595,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -31810,31 +34637,23 @@ "uri-js": "^4.2.2" } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true }, + "espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + } + }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -31844,26 +34663,11 @@ "is-glob": "^4.0.3" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -32118,28 +34922,28 @@ } }, "espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", "dev": true, "requires": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true } } }, "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -32211,14 +35015,14 @@ } }, "eventsource-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", - "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" }, "exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==" }, "express": { "version": "4.22.1", @@ -32295,15 +35099,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "requires": { - "side-channel": "^1.1.0" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -32340,23 +35135,11 @@ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==" }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -32369,15 +35152,6 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==" }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -32537,22 +35311,6 @@ "is-callable": "^1.2.7" } }, - "foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "requires": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - } - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -32636,9 +35394,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==" }, "get-intrinsic": { "version": "1.3.0", @@ -32683,26 +35441,15 @@ } }, "glob": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-12.0.0.tgz", - "integrity": "sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "requires": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "dependencies": { - "jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "requires": { - "@isaacs/cliui": "^8.0.2" - } - }, "lru-cache": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", @@ -32736,6 +35483,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true + }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -32743,9 +35496,9 @@ "dev": true }, "globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", "dev": true }, "globalthis": { @@ -32768,12 +35521,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -32800,6 +35547,11 @@ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -33048,17 +35800,17 @@ } }, "hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "requires": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "dependencies": { "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==" } } }, @@ -33247,40 +35999,10 @@ "url-join": "^2.0.5" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -33315,13 +36037,6 @@ "integrity": "sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==", "requires": { "@babel/runtime": "^7.28.4" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" - } } }, "iconv-lite": { @@ -33344,6 +36059,11 @@ "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.7.4.tgz", "integrity": "sha512-uCdSpLo3uMfqOmrwXTpR1k/sq4sSmKC7l4o/LdJOEU+MMMq+wkevRqOQYn3lP7vfz9Mv+USBEqPvi0XhdL9ENw==" }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -33351,27 +36071,19 @@ "dev": true }, "ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "requires": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "requires": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" } } } @@ -33420,9 +36132,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==" }, "internal-slot": { "version": "1.1.0", @@ -33436,20 +36148,9 @@ } }, "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - } - } + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==" }, "ipaddr.js": { "version": "2.2.0", @@ -33601,6 +36302,12 @@ "is-extglob": "^2.1.1" } }, + "is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true + }, "is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -33842,12 +36549,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -33856,15 +36557,6 @@ "requires": { "semver": "^7.5.3" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -33911,15 +36603,6 @@ "set-function-name": "^2.0.2" } }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -33930,48 +36613,12 @@ "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jasmine-core": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.12.1.tgz", - "integrity": "sha512-P/UbRZ0LKwXe7wEpwDheuhunPwITn4oPALhrJEQJo6756EwNGnsK/TSQrWojBB4cQDQ+VaxWYws9tFNDuiMh2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.0.1.tgz", + "integrity": "sha512-gUtzV5ASR0MLBwDNqri4kBsgKNCcRQd9qOlNw/w/deavD0cl3JmWXXfH8JhKM4LTg6LPTt2IOQ4px3YYfgh2Xg==", "dev": true }, "jasmine-spec-reporter": { @@ -33994,12 +36641,6 @@ "supports-color": "^8.0.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -34012,11 +36653,16 @@ } }, "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true }, + "jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==" + }, "jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", @@ -34046,7 +36692,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, "requires": { "argparse": "^2.0.1" }, @@ -34054,20 +36699,14 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" } } }, - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-buffer": { "version": "3.0.1", @@ -34076,15 +36715,20 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==" }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==" + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -34420,9 +37064,9 @@ "integrity": "sha512-ZBqC+BBlofznDIY3SfjXDBVdIhYfz7bq8HAHztlw4XOnu++nHiWtCGPgzpdeAhPkByc68DaKNy3E3rY4XrdRtQ==" }, "less": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", - "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", + "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -34486,6 +37130,12 @@ "webpack-sources": "^3.0.0" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -34500,11 +37150,11 @@ "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==" }, "listr2": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", - "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "requires": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -34513,19 +37163,19 @@ }, "dependencies": { "ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" }, "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" }, "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" }, "eventemitter3": { "version": "5.0.1", @@ -34543,17 +37193,17 @@ } }, "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "requires": { "ansi-regex": "^6.0.1" } }, "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "requires": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -34562,28 +37212,68 @@ } } }, + "lit": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "requires": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" + }, + "dependencies": { + "lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "requires": { + "@types/trusted-types": "^2.0.2" + } + } + } + }, + "lit-element": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "requires": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.8.0" + }, + "dependencies": { + "lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "requires": { + "@types/trusted-types": "^2.0.2" + } + } + } + }, "lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", "requires": { "@types/trusted-types": "^2.0.2" } }, "lmdb": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", - "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.4.tgz", + "integrity": "sha512-+Y2DqovevLkb6DrSQ6SXTYLEd6kvlRbhsxzgJrk7BUfOVA/mt21ak6pFDZDKxiAczHMWxrb02kXBTSTIA0O94A==", "dev": true, "optional": true, "requires": { - "@lmdb/lmdb-darwin-arm64": "3.4.2", - "@lmdb/lmdb-darwin-x64": "3.4.2", - "@lmdb/lmdb-linux-arm": "3.4.2", - "@lmdb/lmdb-linux-arm64": "3.4.2", - "@lmdb/lmdb-linux-x64": "3.4.2", - "@lmdb/lmdb-win32-arm64": "3.4.2", - "@lmdb/lmdb-win32-x64": "3.4.2", + "@lmdb/lmdb-darwin-arm64": "3.4.4", + "@lmdb/lmdb-darwin-x64": "3.4.4", + "@lmdb/lmdb-linux-arm": "3.4.4", + "@lmdb/lmdb-linux-arm64": "3.4.4", + "@lmdb/lmdb-linux-x64": "3.4.4", + "@lmdb/lmdb-win32-arm64": "3.4.4", + "@lmdb/lmdb-win32-x64": "3.4.4", "msgpackr": "^1.11.2", "node-addon-api": "^6.1.0", "node-gyp-build-optional-packages": "5.2.2", @@ -34592,9 +37282,9 @@ } }, "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true }, "loader-utils": { @@ -34613,14 +37303,24 @@ } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==" }, "lodash.debounce": { "version": "4.0.8", @@ -34628,15 +37328,26 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.take": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.take/-/lodash.take-4.1.1.tgz", + "integrity": "sha512-3T118EQjnhr9c0aBKCCMhQn0OBwRMz/O2WaRU6VH0TSKoMCmFtUpr0iUp+eWKODEiRXtYOK7R7SiBneKHdk7og==" + }, "log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, "requires": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" @@ -34645,12 +37356,14 @@ "chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true }, "is-unicode-supported": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true } } }, @@ -34689,23 +37402,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, - "is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "requires": { - "get-east-asian-width": "^1.0.0" - } - }, - "slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "requires": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - } - }, "string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -34783,6 +37479,7 @@ "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -34812,21 +37509,21 @@ "dev": true }, "make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", + "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", "requires": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "dependencies": { "negotiator": { @@ -34871,6 +37568,11 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -35033,6 +37735,12 @@ "@types/mdast": "^4.0.0" } }, + "mdn-data": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", + "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", + "dev": true + }, "mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -35050,14 +37758,16 @@ "dev": true }, "memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.52.0.tgz", + "integrity": "sha512-dG5ZY1wUCPWhtl4M2mlc7Wx4OrMGtiI79axnScxwDoPR/25biQYrYm21OpKyZcnKv8pvWaX95SRtZgecZ84gFg==", "dev": true, "requires": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, @@ -35111,12 +37821,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -35522,9 +38226,9 @@ } }, "minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.0.tgz", + "integrity": "sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==", "requires": { "encoding": "^0.1.13", "minipass": "^7.0.3", @@ -35602,9 +38306,9 @@ } }, "minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "requires": { "minipass": "^7.1.2" } @@ -35636,9 +38340,9 @@ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" }, "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true }, "ms": { @@ -35647,9 +38351,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.8.tgz", + "integrity": "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==", "dev": true, "optional": true, "requires": { @@ -35764,11 +38468,11 @@ } }, "ngx-cookie-service": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-20.1.1.tgz", - "integrity": "sha512-jGjjIqu+Kt8De6YjDqTQOaUHKB7gYs0eaDuLyXfNhfKnA78lA7D7oWcaIzjkmXhRqTnh2/ex1UHmZHN9MX0yoQ==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-21.1.0.tgz", + "integrity": "sha512-W3IsoMImUVNt0ZuMesEuQJUGrEgKJaPkQGGfCg7zjUGM/EaeAIbIkfNktNIgUDmeUYapZQJa2pSg4YuK4v1gVQ==", "requires": { - "tslib": "^2.8.0" + "tslib": "^2.8.1" } }, "node-addon-api": { @@ -35785,62 +38489,34 @@ "dev": true }, "node-gyp": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", - "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.1.0.tgz", + "integrity": "sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==", "requires": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", + "tar": "^7.5.2", "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "which": "^6.0.0" }, "dependencies": { - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, "isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" }, - "mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" - }, - "tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - } - }, "which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "requires": { "isexe": "^3.1.1" } - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, @@ -35855,16 +38531,16 @@ } }, "node-releases": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", - "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" }, "nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "requires": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" } }, "normalize-path": { @@ -35873,75 +38549,71 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, "npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "requires": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" } }, "npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "requires": { "semver": "^7.1.1" } }, "npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==" }, "npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "requires": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" } }, "npm-packlist": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", - "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", "requires": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" } }, "npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "requires": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", "semver": "^7.3.5" } }, "npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "requires": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", + "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" } }, "nth-check": { @@ -36107,29 +38779,95 @@ "wsl-utils": "^0.1.0" } }, + "openapi-data-validator": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/openapi-data-validator/-/openapi-data-validator-2.0.54.tgz", + "integrity": "sha512-JsqqILn+NwgsjA2wJsY+qvVqtkaWz7cnf7gbT+1Nm54+NSsQNguV+fd3Y6WefTkLug6PLws+zylfZ7QjD0s71Q==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^9.0", + "ajv": "^8.5", + "ajv-formats": "^2.1", + "content-type": "^1.0", + "lodash.clonedeep": "^4.5", + "lodash.get": "^4.4", + "media-typer": "^1.1", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" + } + } + }, + "openapi-explorer": { + "version": "2.4.788", + "resolved": "https://registry.npmjs.org/openapi-explorer/-/openapi-explorer-2.4.788.tgz", + "integrity": "sha512-463tX2LYtyYJ8Jwgpi2U/Dan7rwfLZm+Ev8K/VZ01O84vyDpo14146jhnJnaMeU9tzmpPNmXrEiK609M1WeAVw==", + "requires": { + "@authress/login": "^2.0", + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "color": "^4.2.3", + "i18next": "^21.9.0", + "json5": "^2.2.3", + "lit": "^2.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.merge": "^4.6.2", + "marked": "^4.0.16", + "openapi-data-validator": "^2.0.40", + "openapi-resolver": "^4.1.71", + "prismjs": "^1.29.0", + "randexp": "^0.5.3", + "xml-but-prettier": "^1.0.1" + }, + "dependencies": { + "i18next": { + "version": "21.10.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", + "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", + "requires": { + "@babel/runtime": "^7.17.2" + } + } + } + }, + "openapi-resolver": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/openapi-resolver/-/openapi-resolver-4.2.4.tgz", + "integrity": "sha512-AjR/hIVI5qfyI6VmTjpQIXjTmxmWjqXqxSqkRdeWQrUATYsTVNQ3uSxK8NJ7QEXwfiKyID/iWf9iPuBxoWWoiA==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^9.0.9", + "@babel/runtime-corejs3": "^7.18.9", + "js-yaml": "^4.1.1", + "lodash.clonedeepwith": "^4.5.0" + } + }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" }, "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" } }, "ora": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, "requires": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", @@ -36145,22 +38883,26 @@ "ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true }, "chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true }, "emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true }, "string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "requires": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -36171,6 +38913,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "requires": { "ansi-regex": "^6.0.1" } @@ -36178,9 +38921,9 @@ } }, "ordered-binary": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", - "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "dev": true, "optional": true }, @@ -36219,9 +38962,9 @@ } }, "p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==" }, "p-retry": { "version": "6.2.1", @@ -36242,33 +38985,28 @@ } } }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, "pacote": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", - "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "version": "21.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.4.tgz", + "integrity": "sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==", "requires": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^10.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" } }, "pako": { @@ -36302,12 +39040,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true } } }, @@ -36329,7 +39061,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", - "dev": true, "requires": { "entities": "^6.0.0", "parse5": "^8.0.0", @@ -36339,14 +39070,12 @@ "entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" }, "parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, "requires": { "entities": "^6.0.0" } @@ -36357,7 +39086,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", - "dev": true, "requires": { "parse5": "^8.0.0" }, @@ -36365,14 +39093,12 @@ "entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" }, "parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, "requires": { "entities": "^6.0.0" } @@ -36406,22 +39132,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - } - } - }, "path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -36446,18 +39156,18 @@ "dev": true }, "piscina": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", - "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.4.tgz", + "integrity": "sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==", "dev": true, "requires": { "@napi-rs/nice": "^1.0.4" } }, "pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==" }, "portfinder": { "version": "1.0.32", @@ -36505,14 +39215,14 @@ } }, "postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", + "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", "dev": true, "requires": { "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" + "jiti": "^2.5.1", + "semver": "^7.6.2" } }, "postcss-media-query-parser": { @@ -36571,6 +39281,12 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true + }, "preact": { "version": "10.12.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", @@ -36582,10 +39298,15 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" + }, "proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==" }, "process-nextick-args": { "version": "2.0.1", @@ -36829,7 +39550,8 @@ "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true }, "punycode.js": { "version": "2.3.1", @@ -36848,18 +39570,21 @@ "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==" }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "requires": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" } }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + } }, "randombytes": { "version": "2.1.0", @@ -36876,26 +39601,47 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true + } } }, "react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==" + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==" }, "react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "requires": { "scheduler": "^0.27.0" } @@ -37017,9 +39763,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -37046,17 +39792,17 @@ } }, "regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" } }, "regjsgen": { @@ -37066,12 +39812,12 @@ "dev": true }, "regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "requires": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" } }, "rehype-format": { @@ -37170,6 +39916,11 @@ "unified": "^11.0.0" } }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -37187,11 +39938,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "requires": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -37258,17 +40009,16 @@ } } }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, "rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -37299,34 +40049,60 @@ } } }, - "rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "rolldown": { + "version": "1.0.0-beta.58", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.58.tgz", + "integrity": "sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@oxc-project/types": "=0.106.0", + "@rolldown/binding-android-arm64": "1.0.0-beta.58", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.58", + "@rolldown/binding-darwin-x64": "1.0.0-beta.58", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.58", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.58", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.58", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.58", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.58", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.58", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.58", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.58", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.58", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.58", + "@rolldown/pluginutils": "1.0.0-beta.58" + } + }, + "rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", "@types/estree": "1.0.8", "fsevents": "~2.3.2" } @@ -37349,17 +40125,17 @@ }, "dependencies": { "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "requires": { "ms": "^2.1.3" } }, "path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==" } } }, @@ -37369,15 +40145,6 @@ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, "rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -37432,9 +40199,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", - "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", + "integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==", "dev": true, "requires": { "@parcel/watcher": "^2.4.1", @@ -37461,18 +40228,18 @@ } }, "sass-loader": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", - "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", + "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", "dev": true, "requires": { "neo-async": "^2.6.2" } }, "sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", "dev": true, "optional": true }, @@ -37539,9 +40306,9 @@ } }, "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" }, "send": { "version": "0.19.0", @@ -37806,47 +40573,54 @@ } }, "sigstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", - "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", "requires": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" } }, - "sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, + "simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==" + } } }, "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "dependencies": { "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" }, "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "requires": { + "get-east-asian-width": "^1.3.1" + } } } }, @@ -37910,11 +40684,11 @@ } }, "socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "requires": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, @@ -37953,25 +40727,6 @@ "yargs": "^16.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -37986,12 +40741,6 @@ "path-is-absolute": "^1.0.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -38011,15 +40760,6 @@ "glob": "^7.1.3" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, "temp": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", @@ -38126,9 +40866,9 @@ } }, "spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" }, "spdy": { "version": "4.0.2", @@ -38163,9 +40903,9 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", + "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", "requires": { "minipass": "^7.0.3" } @@ -38233,23 +40973,6 @@ } } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - } - }, "string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -38347,14 +41070,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -38405,6 +41120,14 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -38424,94 +41147,46 @@ } }, "tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true }, "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", + "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, "terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.25", @@ -38531,9 +41206,9 @@ } }, "schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -38569,9 +41244,9 @@ } }, "thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "dev": true }, "thunky": { @@ -38600,12 +41275,12 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "requires": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "dependencies": { "picomatch": { @@ -38643,16 +41318,10 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true - }, "tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true }, "tree-kill": { @@ -38687,9 +41356,9 @@ "integrity": "sha512-DZ+sJvBdOluThwCBcCdDnz0NiVeQxEwveL+cmkJGLO1ps+x/D0xwSefmOIa1S7p2nXFHH52ZPr/8VEvxZHaNgg==" }, "ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true }, "ts-node": { @@ -38730,19 +41399,19 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tuf-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", - "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "requires": { - "@tufjs/models": "3.0.1", - "debug": "^4.4.1", - "make-fetch-happen": "^14.0.3" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "dependencies": { "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "requires": { "ms": "^2.1.3" } @@ -38856,58 +41525,163 @@ } }, "typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true }, "typescript-eslint": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", - "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2" + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" }, "dependencies": { "@typescript-eslint/eslint-plugin": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", - "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" } }, - "@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "@typescript-eslint/parser": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" } }, + "@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + } + }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "dev": true + }, + "@typescript-eslint/type-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + } + }, + "@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "dev": true, + "requires": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + } + }, + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, "ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } } } }, @@ -38934,6 +41708,12 @@ "which-boxed-primitive": "^1.1.1" } }, + "undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -38951,15 +41731,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true }, "unified": { @@ -38985,17 +41765,17 @@ } }, "unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", "requires": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" } }, "unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "requires": { "imurmurhash": "^0.1.4" } @@ -39064,9 +41844,9 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "requires": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -39076,6 +41856,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -39171,9 +41952,9 @@ } }, "validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==" }, "vary": { "version": "1.1.2", @@ -39208,12 +41989,12 @@ } }, "vite": { - "version": "7.1.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", - "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "requires": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "fsevents": "~2.3.3", "picomatch": "^4.0.3", @@ -39227,16 +42008,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - } } } }, @@ -39252,9 +42023,9 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" }, "watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", + "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -39283,9 +42054,9 @@ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" }, "webpack": { - "version": "5.101.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", - "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.7", @@ -39296,22 +42067,22 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "dependencies": { @@ -39347,9 +42118,9 @@ "dev": true }, "schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -39360,49 +42131,15 @@ } } }, - "webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true - } - } - }, "webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -39417,6 +42154,21 @@ "fast-deep-equal": "^3.1.3" } }, + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + }, "schema-utils": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", @@ -39642,6 +42394,12 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -39651,37 +42409,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - } } }, "wrappy": { @@ -39734,6 +42461,14 @@ } } }, + "xml-but-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", + "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", + "requires": { + "repeat-string": "^1.5.2" + } + }, "y-prosemirror": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", @@ -39780,20 +42515,25 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, - "yoctocolors-cjs": { + "yoctocolors": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==" + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==" + }, + "yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==" }, "zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==" }, "zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==" + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==" }, "zod-validation-error": { "version": "4.0.2", diff --git a/frontend/package.json b/frontend/package.json index dbdbb3806a1..7a05d5b0374 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,49 +5,50 @@ "version": "0.1.0", "private": true, "devDependencies": { - "@angular-builders/custom-esbuild": "^20.0.0", - "@angular-devkit/build-angular": "^20.3.12", + "@angular-builders/custom-esbuild": "^21.0.3", + "@angular-devkit/build-angular": "^21.1.1", "@angular-eslint/builder": "20.7.0", "@angular-eslint/eslint-plugin": "20.7.0", "@angular-eslint/eslint-plugin-template": "20.7.0", "@angular-eslint/schematics": "20.7.0", "@angular-eslint/template-parser": "20.7.0", - "@angular/language-service": "20.3.14", - "@eslint/js": "^9.39.1", - "@html-eslint/eslint-plugin": "^0.49.0", - "@html-eslint/parser": "^0.49.0", + "@angular/language-service": "21.1.1", + "@eslint/js": "^9.39.2", + "@html-eslint/eslint-plugin": "^0.54.0", + "@html-eslint/parser": "^0.54.0", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@stylistic/eslint-plugin": "^5.5.0", + "@stylistic/eslint-plugin": "^5.6.1", "@types/codemirror": "5.60.5", "@types/dom-navigation": "^1.0.3", "@types/dragula": "^3.7.5", "@types/flot": "^0.0.36", "@types/hammerjs": "^2.0.36", - "@types/jasmine": "~5.1.12", + "@types/hotwired__turbo": "^8.0.5", + "@types/jasmine": "~6.0.0", "@types/jquery": "^3.5.33", "@types/jqueryui": "^1.12.24", - "@types/lodash": "^4.17.21", + "@types/lodash": "^4.17.23", "@types/mousetrap": "^1.6.3", "@types/pako": "^2.0.4", "@types/rails__request.js": "^0.0.1", - "@types/react": "^19.2.7", + "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", "@types/resize-observer-browser": "^0.1.4", "@types/urijs": "^1.19.26", "@types/uuid": "^11.0.0", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "8.46.3", - "@typescript-eslint/parser": "8.46.2", - "angular-eslint": "^20.5.1", - "browserslist": "^4.27.0", - "eslint": "^9.39.1", + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.52.0", + "angular-eslint": "^21.1.0", + "browserslist": "^4.28.1", + "eslint": "^9.39.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", - "globals": "^16.5.0", - "jasmine-core": "~5.12.1", + "globals": "^17.0.0", + "jasmine-core": "~6.0.1", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", @@ -58,24 +59,23 @@ "karma-spec-reporter": "^0.0.36", "source-map-explorer": "^2.5.2", "ts-node": "~10.9.2", - "typescript": "^5.8.3", - "typescript-eslint": "^8.46.2", - "webpack-bundle-analyzer": "^4.4.2", + "typescript": "^5.9.3", + "typescript-eslint": "^8.54.0", "wscat": "^6.1.0" }, "dependencies": { - "@angular/animations": "^20.3.14", - "@angular/cdk": "^20.2.14", - "@angular/cli": "^20.3.12", - "@angular/common": "^20.3.14", - "@angular/compiler": "^20.3.15", - "@angular/compiler-cli": "^20.3.14", - "@angular/core": "^20.3.14", - "@angular/elements": "^20.3.14", - "@angular/forms": "^20.3.14", - "@angular/platform-browser": "^20.3.14", - "@angular/platform-browser-dynamic": "^20.3.14", - "@angular/router": "^20.3.14", + "@angular/animations": "^21.1.1", + "@angular/cdk": "^21.1.1", + "@angular/cli": "^21.1.1", + "@angular/common": "^21.1.1", + "@angular/compiler": "^21.1.1", + "@angular/compiler-cli": "^21.1.1", + "@angular/core": "^21.1.1", + "@angular/elements": "^21.1.1", + "@angular/forms": "^21.1.1", + "@angular/platform-browser": "^21.1.1", + "@angular/platform-browser-dynamic": "^21.1.1", + "@angular/router": "^21.1.1", "@appsignal/javascript": "^1.6.1", "@appsignal/plugin-breadcrumbs-console": "^1.1.37", "@appsignal/plugin-breadcrumbs-network": "^1.1.24", @@ -85,63 +85,62 @@ "@braintree/sanitize-url": "^7.1.1", "@datorama/akita": "^8.0.1", "@floating-ui/dom": "^1.2.1", - "@fullcalendar/angular": "^6.1.10", + "@fullcalendar/angular": "^6.1.20", "@fullcalendar/common": "^5.11.5", - "@fullcalendar/core": "^6.1.11", - "@fullcalendar/daygrid": "^6.1.11", - "@fullcalendar/interaction": "^6.1.11", - "@fullcalendar/list": "^6.1.11", - "@fullcalendar/moment": "^6.1.17", - "@fullcalendar/moment-timezone": "^6.1.17", - "@fullcalendar/resource": "^6.1.11", + "@fullcalendar/core": "^6.1.20", + "@fullcalendar/daygrid": "^6.1.20", + "@fullcalendar/interaction": "^6.1.20", + "@fullcalendar/list": "^6.1.20", + "@fullcalendar/moment": "^6.1.20", + "@fullcalendar/moment-timezone": "^6.1.20", + "@fullcalendar/resource": "^6.1.20", "@fullcalendar/resource-common": "^5.11.5", - "@fullcalendar/resource-timeline": "^6.1.11", - "@fullcalendar/timegrid": "^6.1.11", + "@fullcalendar/resource-timeline": "^6.1.20", + "@fullcalendar/timegrid": "^6.1.20", "@github/webauthn-json": "^2.1.1", - "@hocuspocus/provider": "^3.4.0", + "@hocuspocus/provider": "^3.4.4", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo": "^8.0.20", "@hotwired/turbo-rails": "^8.0.20", - "@knowledgecode/delegate": "^0.8.5", + "@knowledgecode/delegate": "^0.10.0", "@kolkov/ngx-gallery": "^2.0.1", - "@mantine/core": "^8.3.7", + "@mantine/core": "^8.3.10", "@mantine/hooks": "^8.3.6", "@mantine/utils": "^6.0.22", "@ng-select/ng-option-highlight": "^20.6.3", "@ng-select/ng-select": "^20.1.0", "@ngneat/content-loader": "^7.0.0", "@openproject/octicons-angular": "^19.32.0", - "@openproject/primer-view-components": "^0.79.1", + "@openproject/primer-view-components": "^0.80.2", "@openproject/reactivestates": "^3.0.1", - "@primer/css": "^22.0.2", + "@primer/css": "^22.1.0", "@primer/live-region-element": "^0.8.0", - "@primer/primitives": "^11.3.1", - "@primer/view-components": "npm:@openproject/primer-view-components@^0.79.1", - "@rails/request.js": "^0.0.12", + "@primer/primitives": "^11.3.2", + "@primer/view-components": "npm:@openproject/primer-view-components@^0.80.2", + "@rails/request.js": "^0.0.13", "@stimulus-components/auto-submit": "^6.0.0", "@stimulus-components/reveal": "^5.0.0", - "@tiptap/extensions": "^3.11.0", - "@types/hotwired__turbo": "^8.0.1", + "@tiptap/extensions": "^3.13.0", "@types/jquery.cookie": "^1.4.36", "@uirouter/angular": "^17.0.0", "@uirouter/core": "^6.1.0", "@uirouter/rx": "^1.0.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.7.1", - "autoprefixer": "^10.4.22", + "autoprefixer": "^10.4.23", "byte-base64": "^1.1.0", "chart.js": "4.5.1", "chartjs-plugin-datalabels": "^2.2.0", "codemirror": "^5.62.0", "copy-text-to-clipboard": "^3.2.2", - "core-js": "^3.46.0", + "core-js": "^3.47.0", "crossvent": "^1.5.4", "dom-autoscroller": "^2.2.8", "dom-plane": "^1.0.2", "dragula": "^3.7.3", "es6-slide-up-down": "^1.0.0", "flatpickr": "^4.6.13", - "glob": "^12.0.0", + "glob": "^13.0.0", "hammerjs": "^2.0.8", "i18n-js": "^4.3.0", "idiomorph": "^0.7.4", @@ -150,8 +149,8 @@ "jquery.cookie": "^1.4.1", "jquery.flot": "^0.8.3", "json5": "^2.2.2", - "lit-html": "^3.3.1", - "lodash": "^4.17.21", + "lit-html": "^3.3.2", + "lodash": "^4.17.23", "mark.js": "^8.11.0", "mdx-embed": "^1.1.2", "mime": "^4.1.0", @@ -161,13 +160,14 @@ "ng-dynamic-component": "^10.7.0", "ng2-charts": "^8.0.0", "ng2-dragula": "^6.0.0", - "ngx-cookie-service": "^20.1.1", + "ngx-cookie-service": "^21.1.0", "observable-array": "0.0.4", "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.0.22/op-blocknote-extensions-0.0.22.tgz", + "openapi-explorer": "^2.4.788", "pako": "^2.0.3", "qr-creator": "^1.0.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.0", "screenfull": "^6.0.2", @@ -191,11 +191,11 @@ "os": false }, "scripts": { - "analyze": "ng build --configuration production --stats-json && webpack-bundle-analyzer -h 0.0.0.0 -p 9999 ../public/assets/frontend/stats.json", + "analyze": "ng build --configuration production --stats-json && npx esbuild-visualizer --metadata ../public/assets/frontend/stats.json", "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration production --named-chunks --source-map", "build:watch": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --watch --named-chunks", "ci:plugins:register_frontend": "node ci-plugins-generator.js", - "serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200}", + "serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host ${FE_HOST:-localhost} --port ${FE_PORT:-4200} --serve-path ${RAILS_RELATIVE_URL_ROOT}/assets/frontend", "test": "ng test --watch=false", "test:watch": "ng test --watch=true", "lint": "ng lint", diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index e053997a690..028cdc1ed2c 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -67,9 +67,6 @@ import { OpenprojectEnterpriseModule } from 'core-app/features/enterprise/openpr import { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service'; import { ConfirmDialogModalComponent } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal'; import { DynamicContentModalComponent } from 'core-app/shared/components/modals/modal-wrapper/dynamic-content.modal'; -import { - PasswordConfirmationModalComponent, -} from 'core-app/shared/components/modals/request-for-confirmation/password-confirmation.modal'; import { OpHeaderProjectSelectComponent, } from 'core-app/shared/components/header-project-select/header-project-select.component'; @@ -256,7 +253,6 @@ export function runBootstrap(appRef:ApplicationRef) { // Modals ConfirmDialogModalComponent, DynamicContentModalComponent, - PasswordConfirmationModalComponent, // Main menu MainMenuResizerComponent, diff --git a/frontend/src/app/core/global_search/input/global-search-input-mobile.component.sass b/frontend/src/app/core/global_search/input/global-search-input-mobile.component.sass index a96eb3d3581..9bb2c3bb065 100644 --- a/frontend/src/app/core/global_search/input/global-search-input-mobile.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input-mobile.component.sass @@ -21,7 +21,8 @@ $search-input-height-mobile: 36px right: 0 .ng-select-bottom - height: calc(100vh - #{var(--header-height)}) + height: auto + max-height: calc(100vh - #{var(--header-height)}) overflow-y: auto margin: 0 diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.html b/frontend/src/app/core/global_search/input/global-search-input.component.html index bcdef37e012..79ba5b741a7 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.html +++ b/frontend/src/app/core/global_search/input/global-search-input.component.html @@ -66,14 +66,18 @@ @if (!item.id) {
    - +
    } @else { + (click)="startEditing()" + (keydown.enter)="startEditing()" + (keydown.space)="startEditing()"> } @if (editing) { diff --git a/frontend/src/app/features/admin/types/query-group.component.html b/frontend/src/app/features/admin/types/query-group.component.html index a2bf7930306..47e6afddaa3 100644 --- a/frontend/src/app/features/admin/types/query-group.component.html +++ b/frontend/src/app/features/admin/types/query-group.component.html @@ -15,7 +15,12 @@ />
    - + {{ text.edit_query }} diff --git a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html index 3c4f99b60cf..b0b79b1b7fb 100644 --- a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html +++ b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html @@ -17,13 +17,14 @@
    } @if (viewerVisible && createAllowed) { -
    {{text.viewpoint}} - + } } diff --git a/frontend/src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.component.html b/frontend/src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.component.html index 6c1d76e9cae..8b6d01e14c6 100644 --- a/frontend/src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.component.html +++ b/frontend/src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.component.html @@ -90,7 +90,7 @@
    diff --git a/frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html b/frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html index c345945cfad..b85f2174ce6 100644 --- a/frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html +++ b/frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html @@ -41,7 +41,11 @@ } @if (board.editable) {
    + role="button" + tabindex="0" + (click)="addList(board)" + (keydown.enter)="addList(board)" + (keydown.space)="addList(board)">
    diff --git a/frontend/src/app/features/boards/board/board.ts b/frontend/src/app/features/boards/board/board.ts index 14dd8e6b112..9e0f0341e29 100644 --- a/frontend/src/app/features/boards/board/board.ts +++ b/frontend/src/app/features/boards/board/board.ts @@ -3,7 +3,7 @@ import { GridResource } from 'core-app/features/hal/resources/grid-resource'; import { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const'; import { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder'; -export type BoardType = 'free'|'action'; +export type BoardType = 'free' | 'action'; export interface BoardWidgetOption { queryId:string; @@ -18,6 +18,10 @@ export class Board { return this.grid.id; } + public get projectId() { + return this.grid.projectId; + } + public get name() { return this.grid.name; } @@ -34,7 +38,7 @@ export class Board { return this.grid.options.type === 'action'; } - public get actionAttribute():string|undefined { + public get actionAttribute():string | undefined { if (this.isFree) { return undefined; } diff --git a/frontend/src/app/features/boards/board/toolbar-menu/boards-toolbar-menu.directive.ts b/frontend/src/app/features/boards/board/toolbar-menu/boards-toolbar-menu.directive.ts index 0ecf746de4e..ce45ca6d7ae 100644 --- a/frontend/src/app/features/boards/board/toolbar-menu/boards-toolbar-menu.directive.ts +++ b/frontend/src/app/features/boards/board/toolbar-menu/boards-toolbar-menu.directive.ts @@ -109,7 +109,7 @@ export class BoardsToolbarMenuDirective extends OpContextMenuTrigger { && window.confirm(this.I18n.t('js.text_query_destroy_confirmation'))) { void this.http .delete( - `/boards/${this.board.id}`, + `/projects/${this.board.projectId}/boards/${this.board.id}`, { responseType: 'json' }, ) .subscribe( diff --git a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass index 80ed81cca86..3c8204640d9 100644 --- a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass +++ b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass @@ -1,3 +1,6 @@ +op-wp-calendar + height: 100% + .op-wp-calendar --fc-border-color: var(--borderColor-default) diff --git a/frontend/src/app/features/hal/resources/grid-resource.ts b/frontend/src/app/features/hal/resources/grid-resource.ts index 6dac38c1cc9..d61fa8159e4 100644 --- a/frontend/src/app/features/hal/resources/grid-resource.ts +++ b/frontend/src/app/features/hal/resources/grid-resource.ts @@ -29,11 +29,14 @@ import { HalResource } from 'core-app/features/hal/resources/hal-resource'; import { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource'; import { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin'; +import { IHalResourceLink } from 'core-app/core/state/hal-resource'; +import idFromLink from '../helpers/id-from-link'; export interface GridResourceLinks { update(payload:unknown):Promise; updateImmediately(payload:unknown):Promise; delete():Promise; + project:IHalResourceLink; } export class GridBaseResource extends HalResource { @@ -45,6 +48,16 @@ export class GridBaseResource extends HalResource { public columnCount:number; + public $links:GridResourceLinks; + + public get projectId():string|undefined { + if (this.$links.project) { + return idFromLink(this.$links.project.href); + } + + return undefined; + } + public $initialize(source:any) { super.$initialize(source); diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html index 01e403fe667..7c053e6cdc9 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html @@ -1,6 +1,10 @@
    @if (workPackage$ && (workPackage$ | async); as workPackage) { @@ -51,9 +55,12 @@ } diff --git a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.html b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.html index 3a296070f7b..3ebc827c247 100644 --- a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.html +++ b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.html @@ -132,6 +132,7 @@ }