Compare commits

...

35 Commits

Author SHA1 Message Date
Elizabeth Danzberger 3a89c18888
fix(templates): deduplicate provider templates
Signed-off-by: Elizabeth Danzberger <elizabeth@elzody.dev>
2025-12-10 16:06:21 +07:00
F. E Noel Nfebe 186b12b718
Merge pull request #56620 from nextcloud/fix/filter-interaction-issues
fix(unified-search): prevent provider disabling on content filter apply
2025-12-10 20:07:46 +07:00
github-actions[bot] a86a2a070e
Merge pull request #56890 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/libphonenumber-js-1.12.31
build(deps): bump libphonenumber-js from 1.12.29 to 1.12.31 in /build/frontend-legacy
2025-12-10 18:52:47 +07:00
github-actions[bot] 8f82ad358a
Merge pull request #56946 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.2.14
build(deps-dev): bump rector/rector from 2.2.9 to 2.2.14 in /vendor-bin/rector
2025-12-10 19:42:19 +07:00
github-actions[bot] 9af153f5b7
Merge pull request #56950 from nextcloud/dependabot/npm_and_yarn/sass-1.95.1
build(deps-dev): bump sass from 1.94.2 to 1.95.1
2025-12-10 19:41:51 +07:00
nextcloud-command 4a5bacc8c7 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-12-10 18:00:26 +07:00
Andy Scherzinger d50828aa92
Merge pull request #56887 from nextcloud/dependabot/npm_and_yarn/vitest-afa725de22
build(deps-dev): bump the vitest group across 2 directories with 2 updates
2025-12-10 18:57:16 +07:00
github-actions[bot] 258670de61
Merge pull request #56748 from nextcloud/dependabot/composer/bamarni/composer-bin-plugin-1.8.3
build(deps-dev): bump bamarni/composer-bin-plugin from 1.8.2 to 1.8.3
2025-12-10 17:56:30 +07:00
dependabot[bot] 7f76a6d4aa build(deps): bump libphonenumber-js in /build/frontend-legacy
Bumps [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) from 1.12.29 to 1.12.31.
- [Changelog](https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/libphonenumber-js/compare/v1.12.29...v1.12.31)

---
updated-dependencies:
- dependency-name: libphonenumber-js
  dependency-version: 1.12.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 18:51:25 +07:00
github-actions[bot] edbcb6af6f
Merge pull request #56956 from nextcloud/dependabot/npm_and_yarn/vite-1f75bea169
build(deps-dev): bump the vite group across 2 directories with 1 update
2025-12-10 18:50:20 +07:00
F. E Noel Nfebe b07801a2b5
Merge pull request #56652 from nextcloud/fix/federated-share-external-filter
fix(sharing): allow federated shares to non-trusted servers
2025-12-10 18:41:05 +07:00
Salvatore Martire aaf07ab73e
Merge pull request #55072 from nextcloud/feature/54562/pathSpecificFSSetup
Introduces support for mount providers that can provide a partial list of mount points based on a path and the information related to mounts present in that path.
2025-12-10 18:28:15 +07:00
nextcloud-command 5de1d46be4 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-12-10 17:20:09 +07:00
nextcloud-command cf56d6325a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-12-10 17:13:01 +07:00
nfebe 08382282ea fix(sharing): allow federated shares to non-trusted servers
When `showFederatedSharesToTrustedServersAsInternal` is enabled, the
trusted server filter was incorrectly applied to both internal and
external sharing sections. This prevented users from sharing with
federated users on non-trusted servers via the external share UI.

The filter now only applies to the internal section, allowing
non-trusted federated shares to appear in the external section.

Fixes: https://github.com/nextcloud/server/issues/56622

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2025-12-10 17:41:11 +07:00
nfebe f035ff3d3a fix(unified-search): Separate filtered and unfiltered results
Show results from providers that don't support active content filters
(date/person) in a separate "Additional results" section with a note
explaining that some filters may have been ignored.

Changes:
- Add computed properties to separate filtered/unfiltered results
- Track filter compatibility using baseProvider for searchFrom providers
- Deduplicate results by resourceUrl across sections
- Skip in-folder results when at root to avoid duplicating Files results
- Fix providerIsCompatibleWithFilters to check correct filter properties
- Add styling for the unfiltered results section

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2025-12-10 17:30:32 +07:00
nfebe 61ebc6e251 fix(unified-search): prevent provider disabling on content filter apply
When date range or person filters were applied, providers that didn't
support these filters were automatically disabled in the UI. This made
the in-folder filter appear auto-applied and prevented users from
searching non-compatible providers.

Remove automatic provider disabling logic from updateDateFilter(),
applyPersonFilter(), and removeFilter(). Content filters now apply only
to compatible providers via existing compatibility checks while keeping
all providers available for selection.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2025-12-10 17:30:32 +07:00
dependabot[bot] 6bde5db7da build(deps-dev): bump bamarni/composer-bin-plugin from 1.8.2 to 1.8.3
Bumps [bamarni/composer-bin-plugin](https://github.com/bamarni/composer-bin-plugin) from 1.8.2 to 1.8.3.
- [Release notes](https://github.com/bamarni/composer-bin-plugin/releases)
- [Commits](https://github.com/bamarni/composer-bin-plugin/compare/1.8.2...1.8.3)

---
updated-dependencies:
- dependency-name: bamarni/composer-bin-plugin
  dependency-version: 1.8.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 17:13:00 +07:00
Salvatore Martire d14a032220 feat: implement support for authoritative mount providers
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-12-10 16:05:27 +07:00
Salvatore Martire fcdb28e4a3 feat: add IPartialMountProvider to support authoritative mounts
IMountProviders implementing this interface will be able to take
advantage of authoritative mounts.

The function `getMountsFromMountPoints` will receive the path that
the provider is asked to set-up and an array of IMountProviderArgs
providing information regarding the stored mount points and the
file cache data for the related root. The mount provider should verify
the validity of the mounts and return IMountPoints related to them.

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-12-10 16:05:27 +07:00
Salvatore Martire 9b519b4679 refactor: simplify code
replace array_reduce + array_merge with array_merge(...)
replace conditional assignment with ??=

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-12-10 16:05:27 +07:00
Salvatore Martire f47a586cdd docs: update comments
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2025-12-10 16:05:27 +07:00
Daniel ac4e82d2a5
Merge pull request #56925 from nextcloud/fix/dav/escape-summary-description-location
fix(dav): handle HTML in CalDAV invitations
2025-12-10 15:09:16 +07:00
nextcloud-command 161e59929a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-12-10 13:29:31 +07:00
Christoph Wurst dac8818102
fix(dav): handle HTML in CalDAV invitations
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2025-12-10 12:51:18 +07:00
dependabot[bot] 08b39e2585
build(deps-dev): bump the vite group across 2 directories with 1 update
Bumps the vite group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Bumps the vite group with 1 update in the /build/frontend-legacy directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.2.4 to 7.2.7
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite)

Updates `vite` from 7.2.4 to 7.2.7
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite)

Updates `vite` from 7.2.4 to 7.2.7
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite)

Updates `vite` from 7.2.4 to 7.2.7
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 10:53:40 +07:00
dependabot[bot] 24c0f4b06d
build(deps-dev): bump the vitest group across 2 directories with 2 updates
Bumps the vitest group with 1 update in the / directory: [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8).
Bumps the vitest group with 1 update in the /build/frontend-legacy directory: [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8).


Updates `@vitest/coverage-v8` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/coverage-v8)

Updates `vitest` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/vitest)

Updates `@vitest/coverage-v8` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/coverage-v8)

Updates `vitest` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 10:52:33 +07:00
dependabot[bot] 077cb3ebba
build(deps-dev): bump sass from 1.94.2 to 1.95.1
Bumps [sass](https://github.com/sass/dart-sass) from 1.94.2 to 1.95.1.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.94.2...1.95.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.95.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 10:51:34 +07:00
dependabot[bot] 3c809eaceb
build(deps-dev): bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.2.9 to 2.2.14.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.2.9...2.2.14)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.2.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 10:50:45 +07:00
Ferdinand Thiessen 496404de56
Merge pull request #56718 from nextcloud/chore/move-behat-to-vendor-bin
chore: move behat dependencies to vendor-bin
2025-12-10 11:49:42 +07:00
Joas Schilling da1dd481e9
Merge pull request #56900 from nextcloud/fix/noid/allow-macos-on-ci
fix: Allow installation on macOS CI
2025-12-10 11:39:21 +07:00
Nextcloud bot f3c56f051a
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-12-10 00:13:59 +07:00
Ferdinand Thiessen e0e2d0fd2e
chore: drop usage of `-integration` docker image
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-12-10 01:13:50 +07:00
Ferdinand Thiessen 65135bba31
chore: move behat dependencies to vendor-bin
So we do not have 3 locatations to look for PHP dependencies.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-12-10 01:13:50 +07:00
Marcel Müller ae85eab73c fix: Allow installation on macOS CI
Signed-off-by: Marcel Müller <marcel-mueller@gmx.de>
2025-12-07 13:32:43 +07:00
118 changed files with 918 additions and 821 deletions

@ -69,7 +69,7 @@ updates:
target-branch: stable32
directories:
- "/"
- "/build/integration"
- "/vendor-bin/behat"
- "/vendor-bin/cs-fixer"
- "/vendor-bin/openapi-extractor"
- "/vendor-bin/phpunit"

@ -90,6 +90,7 @@ jobs:
- name: Set up Nextcloud
run: |
composer install
mkdir data
echo '<?php $CONFIG=["${{ matrix.key }}" => ["class" => "OC\Files\ObjectStore\S3", "arguments" => ["bucket" => "nextcloud", "autocreate" => true, "key" => "nextcloud", "secret" => "bWluaW8tc2VjcmV0LWtleS1uZXh0Y2xvdWQ=", "hostname" => "localhost", "port" => 9000, "use_ssl" => false, "use_path_style" => true, "uploadPartSize" => 52428800]]];' > config/config.php
echo '<?php $CONFIG=["redis" => ["host" => "localhost", "port" => 6379], "memcache.local" => "\OC\Memcache\Redis", "memcache.distributed" => "\OC\Memcache\Redis"];' > config/redis.config.php

@ -131,12 +131,9 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up production dependencies
run: composer i --no-dev
- name: Set up behat dependencies
working-directory: build/integration
run: composer i
- name: Set up dependencies
run: |
composer install
- name: Set up Talk dependencies
if: ${{ matrix.test-suite == 'videoverification_features' }}

@ -256,7 +256,7 @@ SPDX-FileCopyrightText = "2025 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
[[annotations]]
path = ["composer.json", "composer.lock", ".github/CODEOWNERS", "__tests__/tsconfig.json", "tsconfig.json", "build/integration/composer.**", "vendor-bin/**/composer.json", "vendor-bin/**/composer.lock", "apps/**/composer/composer.json", "apps/**/composer/composer.lock", "apps/**/composer/composer/installed.json"]
path = ["composer.json", "composer.lock", ".github/CODEOWNERS", "__tests__/tsconfig.json", "tsconfig.json", "apps/**/composer/composer.json", "apps/**/composer/composer.lock", "apps/**/composer/composer/installed.json"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2011-2016 ownCloud, Inc., 2016-2024 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-only OR AGPL-3.0-or-later"

@ -17,6 +17,7 @@ OC.L10N.register(
"Delete comment" : "Borrar comentario",
"Cancel edit" : "Cacelar edición",
"New comment" : "Comentario nuevo",
"Write a comment …" : "Escribe un comentario ….",
"Post comment" : "Publicar comentario",
"@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoji, / para selector inteligente",
"Could not reload comments" : "No se pudieron recargar los comentarios",

@ -15,6 +15,7 @@
"Delete comment" : "Borrar comentario",
"Cancel edit" : "Cacelar edición",
"New comment" : "Comentario nuevo",
"Write a comment …" : "Escribe un comentario ….",
"Post comment" : "Publicar comentario",
"@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoji, / para selector inteligente",
"Could not reload comments" : "No se pudieron recargar los comentarios",

@ -73,7 +73,19 @@ OC.L10N.register(
"Where: %s" : "Şurada: %s",
"%1$s via %2$s" : "%1$s, %2$s aracılığıyla",
"In the past on %1$s for the entire day" : "Tüm gün boyunca %1$s zamanında geçmişte",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n dakika içinde","Tüm gün boyunca %1$s zamanında %n dakika içinde"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n saat içinde","Tüm gün boyunca %1$s zamanında %n saat içinde"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n gün içinde","Tüm gün boyunca %1$s zamanında %n gün içinde"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n hafta içinde","Tüm gün boyunca %1$s zamanında %n hafta içinde"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n ay içinde","Tüm gün boyunca %1$s zamanında %n ay içinde"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n yıl içinde","Tüm gün boyunca %1$s zamanında %n yıl içinde"],
"In the past on %1$s between %2$s - %3$s" : "Geçmişte %1$s zamanında %2$s ile %3$s arasında",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["%n dakika içinde %1$s zamanında %2$s ile %3$s arasında","%n dakika içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["%n saat içinde %1$s zamanında %2$s ile %3$s arasında","%n saat içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["%n gün içinde %1$s zamanında %2$s ile %3$s arasında","%n gün içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["%n hafta içinde %1$s zamanında %2$s ile %3$s arasında","%n hafta içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["%n ay içinde %1$s zamanında %2$s ile %3$s arasında","%n ay içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["%n yıl içinde %1$s zamanında %2$s ile %3$s arasında","%n yıl içinde %1$s zamanında %2$s ile %3$s arasında"],
"Could not generate when statement" : "Zaman ifadesi oluşturulamadı",
"Every Day for the entire day" : "Her gün tüm gün boyunca",
"Every Day for the entire day until %1$s" : "%1$s zamanına kadar her gün tüm gün boyunca",
@ -111,8 +123,26 @@ OC.L10N.register(
"On specific dates for the entire day until %1$s" : "Belirli tarihlerde tüm gün boyunca %1$s zamanına kadar",
"On specific dates between %1$s - %2$s until %3$s" : "Belirli tarihlerde %1$s ile %2$s arasında %3$s zamanına kadar",
"In the past on %1$s" : "%1$s zamanında geçmişte",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%1$s zamanında %n dakika içinde","%1$s zamanında %n dakika içinde"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%1$s zamanında %n saat içinde","%1$s zamanında %n saat içinde"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%1$s zamanında %n gün içinde","%1$s zamanında %n gün içinde"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%1$s zamanında %n hafta içinde","%1$s zamanında %n hafta içinde"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%1$s zamanında %n ay içinde","%1$s zamanında %n ay içinde"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%1$s zamanında %n yıl içinde","%1$s zamanında %n yıl içinde"],
"In the past on %1$s then on %2$s" : "Geçmişte %1$s zamanında ardından %2$s zamanında",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["%n saat içinde %1$s zamanında ardından %2$s zamanında","%n saat içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["%n gün içinde %1$s zamanında ardından %2$s zamanında","%n gün içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["%n hafta içinde %1$s zamanında ardından %2$s zamanında","%n hafta içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["%n ay içinde %1$s zamanında ardından %2$s zamanında","%n ay içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["%n yıl içinde %1$s zamanında ardından %2$s zamanında","%n yıl içinde %1$s zamanında ardından %2$s zamanında"],
"In the past on %1$s then on %2$s and %3$s" : "Geçmişte %1$s zamanında ardından %2$s ve %3$s zamanında",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"Could not generate next recurrence statement" : "Sonraki yinelenme ifadesi oluşturulamadı",
"Cancelled: %1$s" : "İptal edildi: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" iptal edildi",

@ -71,7 +71,19 @@
"Where: %s" : "Şurada: %s",
"%1$s via %2$s" : "%1$s, %2$s aracılığıyla",
"In the past on %1$s for the entire day" : "Tüm gün boyunca %1$s zamanında geçmişte",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n dakika içinde","Tüm gün boyunca %1$s zamanında %n dakika içinde"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n saat içinde","Tüm gün boyunca %1$s zamanında %n saat içinde"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n gün içinde","Tüm gün boyunca %1$s zamanında %n gün içinde"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n hafta içinde","Tüm gün boyunca %1$s zamanında %n hafta içinde"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n ay içinde","Tüm gün boyunca %1$s zamanında %n ay içinde"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Tüm gün boyunca %1$s zamanında %n yıl içinde","Tüm gün boyunca %1$s zamanında %n yıl içinde"],
"In the past on %1$s between %2$s - %3$s" : "Geçmişte %1$s zamanında %2$s ile %3$s arasında",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["%n dakika içinde %1$s zamanında %2$s ile %3$s arasında","%n dakika içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["%n saat içinde %1$s zamanında %2$s ile %3$s arasında","%n saat içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["%n gün içinde %1$s zamanında %2$s ile %3$s arasında","%n gün içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["%n hafta içinde %1$s zamanında %2$s ile %3$s arasında","%n hafta içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["%n ay içinde %1$s zamanında %2$s ile %3$s arasında","%n ay içinde %1$s zamanında %2$s ile %3$s arasında"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["%n yıl içinde %1$s zamanında %2$s ile %3$s arasında","%n yıl içinde %1$s zamanında %2$s ile %3$s arasında"],
"Could not generate when statement" : "Zaman ifadesi oluşturulamadı",
"Every Day for the entire day" : "Her gün tüm gün boyunca",
"Every Day for the entire day until %1$s" : "%1$s zamanına kadar her gün tüm gün boyunca",
@ -109,8 +121,26 @@
"On specific dates for the entire day until %1$s" : "Belirli tarihlerde tüm gün boyunca %1$s zamanına kadar",
"On specific dates between %1$s - %2$s until %3$s" : "Belirli tarihlerde %1$s ile %2$s arasında %3$s zamanına kadar",
"In the past on %1$s" : "%1$s zamanında geçmişte",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%1$s zamanında %n dakika içinde","%1$s zamanında %n dakika içinde"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%1$s zamanında %n saat içinde","%1$s zamanında %n saat içinde"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%1$s zamanında %n gün içinde","%1$s zamanında %n gün içinde"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%1$s zamanında %n hafta içinde","%1$s zamanında %n hafta içinde"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%1$s zamanında %n ay içinde","%1$s zamanında %n ay içinde"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%1$s zamanında %n yıl içinde","%1$s zamanında %n yıl içinde"],
"In the past on %1$s then on %2$s" : "Geçmişte %1$s zamanında ardından %2$s zamanında",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["%n saat içinde %1$s zamanında ardından %2$s zamanında","%n saat içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["%n gün içinde %1$s zamanında ardından %2$s zamanında","%n gün içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["%n hafta içinde %1$s zamanında ardından %2$s zamanında","%n hafta içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["%n ay içinde %1$s zamanında ardından %2$s zamanında","%n ay içinde %1$s zamanında ardından %2$s zamanında"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["%n yıl içinde %1$s zamanında ardından %2$s zamanında","%n yıl içinde %1$s zamanında ardından %2$s zamanında"],
"In the past on %1$s then on %2$s and %3$s" : "Geçmişte %1$s zamanında ardından %2$s ve %3$s zamanında",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında","%n dakika içinde %1$s zamanında ardından %2$s ve %3$s zamanında"],
"Could not generate next recurrence statement" : "Sonraki yinelenme ifadesi oluşturulamadı",
"Cancelled: %1$s" : "İptal edildi: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" iptal edildi",

@ -73,7 +73,19 @@ OC.L10N.register(
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"In the past on %1$s for the entire day" : "过去全天 %1$s ",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["在 %n 分钟后全天 %1$s"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["在 %n 小时后全天 %1$s"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["在 %n 天后全天 %1$s"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["在 %n 周后全天 %1$s"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["在 %n 个月后全天 %1$s"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["在 %n 年后全天 %1$s"],
"In the past on %1$s between %2$s - %3$s" : "过去 %2$s - %3$s %1$s",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 分钟后 %1$s"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 小时后 %1$s"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 天后 %1$s"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 周后 %1$s"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 个月后 %1$s"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 年后 %1$s"],
"Could not generate when statement" : "无法生成 when 语句",
"Every Day for the entire day" : "每天全天",
"Every Day for the entire day until %1$s" : "每天全天,直到 %1$s",
@ -111,8 +123,26 @@ OC.L10N.register(
"On specific dates for the entire day until %1$s" : "在特定日期全天,直到 %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "在 %1$s - %2$s 特定日期,直到 %3$s",
"In the past on %1$s" : "在过去 %1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%n 分钟后 %1$s"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%n 小时后 %1$s"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%n 天后 %1$s"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%n 周后 %1$s"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%n 个月后 %1$s"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%n 年后 %1$s"],
"In the past on %1$s then on %2$s" : "过去 %1$s然后 %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["%n 分钟后 %1$s然后 %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["%n 小时后 %1$s然后 %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["%n 天后 %1$s然后 %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["%n 周后 %1$s然后 %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["%n 个月后 %1$s然后 %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["%n 年后 %1$s然后 %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "在过去 %1$s然后 %2$s 和 %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%n 分钟后 %1$s然后 %2$s 和 %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%n 小时后 %1$s然后 %2$s 和 %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%n 天后 %1$s然后 %2$s 和 %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%n 周后 %1$s然后 %2$s 和 %3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%n 个月后 %1$s然后 %2$s 和 %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%n 年后 %1$s然后 %2$s 和 %3$s"],
"Could not generate next recurrence statement" : "无法生成下一个重复语句",
"Cancelled: %1$s" : "已取消:%1$s",
"\"%1$s\" has been canceled" : "“%1$s”已取消",

@ -71,7 +71,19 @@
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"In the past on %1$s for the entire day" : "过去全天 %1$s ",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["在 %n 分钟后全天 %1$s"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["在 %n 小时后全天 %1$s"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["在 %n 天后全天 %1$s"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["在 %n 周后全天 %1$s"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["在 %n 个月后全天 %1$s"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["在 %n 年后全天 %1$s"],
"In the past on %1$s between %2$s - %3$s" : "过去 %2$s - %3$s %1$s",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 分钟后 %1$s"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 小时后 %1$s"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 天后 %1$s"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 周后 %1$s"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 个月后 %1$s"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["在 %2$s - %3$s %n 年后 %1$s"],
"Could not generate when statement" : "无法生成 when 语句",
"Every Day for the entire day" : "每天全天",
"Every Day for the entire day until %1$s" : "每天全天,直到 %1$s",
@ -109,8 +121,26 @@
"On specific dates for the entire day until %1$s" : "在特定日期全天,直到 %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "在 %1$s - %2$s 特定日期,直到 %3$s",
"In the past on %1$s" : "在过去 %1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%n 分钟后 %1$s"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%n 小时后 %1$s"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%n 天后 %1$s"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%n 周后 %1$s"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%n 个月后 %1$s"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%n 年后 %1$s"],
"In the past on %1$s then on %2$s" : "过去 %1$s然后 %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["%n 分钟后 %1$s然后 %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["%n 小时后 %1$s然后 %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["%n 天后 %1$s然后 %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["%n 周后 %1$s然后 %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["%n 个月后 %1$s然后 %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["%n 年后 %1$s然后 %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "在过去 %1$s然后 %2$s 和 %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%n 分钟后 %1$s然后 %2$s 和 %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%n 小时后 %1$s然后 %2$s 和 %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%n 天后 %1$s然后 %2$s 和 %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%n 周后 %1$s然后 %2$s 和 %3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%n 个月后 %1$s然后 %2$s 和 %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%n 年后 %1$s然后 %2$s 和 %3$s"],
"Could not generate next recurrence statement" : "无法生成下一个重复语句",
"Cancelled: %1$s" : "已取消:%1$s",
"\"%1$s\" has been canceled" : "“%1$s”已取消",

@ -144,19 +144,31 @@ class EmailProvider extends AbstractProvider {
IL10N $l10n,
string $calendarDisplayName,
VEvent $vevent):void {
$template->addBodyListItem($calendarDisplayName, $l10n->t('Calendar:'),
$this->getAbsoluteImagePath('actions/info.png'));
$template->addBodyListItem(
htmlspecialchars($calendarDisplayName),
$l10n->t('Calendar:'),
$this->getAbsoluteImagePath('actions/info.png'),
htmlspecialchars($calendarDisplayName),
);
$template->addBodyListItem($this->generateDateString($l10n, $vevent), $l10n->t('Date:'),
$this->getAbsoluteImagePath('places/calendar.png'));
if (isset($vevent->LOCATION)) {
$template->addBodyListItem((string)$vevent->LOCATION, $l10n->t('Where:'),
$this->getAbsoluteImagePath('actions/address.png'));
$template->addBodyListItem(
htmlspecialchars((string)$vevent->LOCATION),
$l10n->t('Where:'),
$this->getAbsoluteImagePath('actions/address.png'),
htmlspecialchars((string)$vevent->LOCATION),
);
}
if (isset($vevent->DESCRIPTION)) {
$template->addBodyListItem((string)$vevent->DESCRIPTION, $l10n->t('Description:'),
$this->getAbsoluteImagePath('actions/more.png'));
$template->addBodyListItem(
htmlspecialchars((string)$vevent->DESCRIPTION),
$l10n->t('Description:'),
$this->getAbsoluteImagePath('actions/more.png'),
htmlspecialchars((string)$vevent->DESCRIPTION),
);
}
}

@ -25,6 +25,7 @@ use Sabre\VObject\ITip\Message;
use Sabre\VObject\Parameter;
use Sabre\VObject\Property;
use Sabre\VObject\Recur\EventIterator;
use function htmlspecialchars;
class IMipService {
@ -80,10 +81,11 @@ class IMipService {
if (!isset($vevent->$property)) {
return $default;
}
$newstring = $vevent->$property->getValue();
$value = $vevent->$property->getValue();
$newstring = $value === null ? null : htmlspecialchars($value);
if (isset($oldVEvent->$property) && $oldVEvent->$property->getValue() !== $newstring) {
$oldstring = $oldVEvent->$property->getValue();
return sprintf($strikethrough, $oldstring, $newstring);
return sprintf($strikethrough, htmlspecialchars($oldstring), $newstring);
}
return $newstring;
}
@ -96,8 +98,8 @@ class IMipService {
return $default;
}
/** @var string|null $newString */
$newString = $vevent->$property->getValue();
$oldString = isset($oldVEvent->$property) ? $oldVEvent->$property->getValue() : null;
$newString = htmlspecialchars($vevent->$property->getValue());
$oldString = isset($oldVEvent->$property) ? htmlspecialchars($oldVEvent->$property->getValue()) : null;
if ($oldString !== $newString) {
return sprintf(
"<span style='text-decoration: line-through'>%s</span><br />%s",
@ -797,10 +799,10 @@ class IMipService {
$strikethrough = "<span style='text-decoration: line-through'>%s</span>";
$newMeetingWhen = $this->generateWhenString($eventReaderCurrent);
$newSummary = isset($vEvent->SUMMARY) && (string)$vEvent->SUMMARY !== '' ? (string)$vEvent->SUMMARY : $this->l10n->t('Untitled event');
$newDescription = isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal;
$newSummary = htmlspecialchars(isset($vEvent->SUMMARY) && (string)$vEvent->SUMMARY !== '' ? (string)$vEvent->SUMMARY : $this->l10n->t('Untitled event'));
$newDescription = htmlspecialchars(isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal);
$newUrl = isset($vEvent->URL) && (string)$vEvent->URL !== '' ? sprintf('<a href="%1$s">%1$s</a>', $vEvent->URL) : $defaultVal;
$newLocation = isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal;
$newLocation = htmlspecialchars(isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal);
$newLocationHtml = $this->linkify($newLocation) ?? $newLocation;
$data = [];
@ -1067,22 +1069,22 @@ class IMipService {
*/
public function addBulletList(IEMailTemplate $template, VEvent $vevent, $data) {
$template->addBodyListItem(
$data['meeting_title_html'] ?? $data['meeting_title'], $this->l10n->t('Title:'),
$data['meeting_title_html'] ?? htmlspecialchars($data['meeting_title']), $this->l10n->t('Title:'),
$this->getAbsoluteImagePath('caldav/title.png'), $data['meeting_title'], '', IMipPlugin::IMIP_INDENT);
if ($data['meeting_when'] !== '') {
$template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('When:'),
$template->addBodyListItem($data['meeting_when_html'] ?? htmlspecialchars($data['meeting_when']), $this->l10n->t('When:'),
$this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT);
}
if ($data['meeting_location'] !== '') {
$template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'),
$template->addBodyListItem($data['meeting_location_html'] ?? htmlspecialchars($data['meeting_location']), $this->l10n->t('Location:'),
$this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT);
}
if ($data['meeting_url'] !== '') {
$template->addBodyListItem($data['meeting_url_html'] ?? $data['meeting_url'], $this->l10n->t('Link:'),
$template->addBodyListItem($data['meeting_url_html'] ?? htmlspecialchars($data['meeting_url']), $this->l10n->t('Link:'),
$this->getAbsoluteImagePath('caldav/link.png'), $data['meeting_url'], '', IMipPlugin::IMIP_INDENT);
}
if (isset($data['meeting_occurring'])) {
$template->addBodyListItem($data['meeting_occurring_html'] ?? $data['meeting_occurring'], $this->l10n->t('Occurring:'),
$template->addBodyListItem($data['meeting_occurring_html'] ?? htmlspecialchars($data['meeting_occurring']), $this->l10n->t('Occurring:'),
$this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_occurring'], '', IMipPlugin::IMIP_INDENT);
}
@ -1090,7 +1092,7 @@ class IMipService {
/* Put description last, like an email body, since it can be arbitrarily long */
if ($data['meeting_description']) {
$template->addBodyListItem($data['meeting_description_html'] ?? $data['meeting_description'], $this->l10n->t('Description:'),
$template->addBodyListItem($data['meeting_description_html'] ?? htmlspecialchars($data['meeting_description']), $this->l10n->t('Description:'),
$this->getAbsoluteImagePath('caldav/description.png'), $data['meeting_description'], '', IMipPlugin::IMIP_INDENT);
}
}

@ -116,6 +116,7 @@ OC.L10N.register(
"General" : "Genel",
"Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
"Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
"Enable folder tree view" : "Klasör ağacı görünümünü aç",
"Default view" : "Varsayılan görünüm",
"All files" : "Tüm dosyalar",
"Personal files" : "Kişisel dosyalar",
@ -139,7 +140,10 @@ OC.L10N.register(
"Show those shortcuts" : "Bu kısayolları görüntüler",
"Warnings" : "Uyarılar",
"Warn before changing a file extension" : "Dosya uzantıları değiştirilmeden önce uyarı görüntülensin",
"Warn before deleting a file" : "Bir dosya silinmeden önce uyarı verilsin",
"WebDAV URL" : "WebDAV adresi",
"Create an app password" : "Bir uygulama parolası oluştur",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Bu hesap için iki adımlı doğrulama açıldığından WebDAV kimlik doğrulaması için gereklidir.",
"How to access files using WebDAV" : "WebDAV ile dosyalara nasıl erişilir",
"Total rows summary" : "Toplam satır özeti",
"Toggle selection for all files and folders" : "Tüm dosyaları ve klasörleri seç/bırak",
@ -265,6 +269,9 @@ OC.L10N.register(
"Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
"All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
"One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["%n dosya dönüştürülemedi","%n dosya dönüştürülemedi"],
"_%n file converted_::_%n files converted_" : ["%n dosya dönüştürüldü","%n dosya dönüştürüldü"],
"Files converted" : "Dosyalar dönüştürüldü",
"Failed to convert files" : "Dosyalar dönüştürülemedi",
"Converting file …" : "Dosya dönüştürülüyor…",
"File successfully converted" : "Dosya dönüştürüldü",

@ -114,6 +114,7 @@
"General" : "Genel",
"Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
"Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
"Enable folder tree view" : "Klasör ağacı görünümünü aç",
"Default view" : "Varsayılan görünüm",
"All files" : "Tüm dosyalar",
"Personal files" : "Kişisel dosyalar",
@ -137,7 +138,10 @@
"Show those shortcuts" : "Bu kısayolları görüntüler",
"Warnings" : "Uyarılar",
"Warn before changing a file extension" : "Dosya uzantıları değiştirilmeden önce uyarı görüntülensin",
"Warn before deleting a file" : "Bir dosya silinmeden önce uyarı verilsin",
"WebDAV URL" : "WebDAV adresi",
"Create an app password" : "Bir uygulama parolası oluştur",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Bu hesap için iki adımlı doğrulama açıldığından WebDAV kimlik doğrulaması için gereklidir.",
"How to access files using WebDAV" : "WebDAV ile dosyalara nasıl erişilir",
"Total rows summary" : "Toplam satır özeti",
"Toggle selection for all files and folders" : "Tüm dosyaları ve klasörleri seç/bırak",
@ -263,6 +267,9 @@
"Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
"All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
"One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["%n dosya dönüştürülemedi","%n dosya dönüştürülemedi"],
"_%n file converted_::_%n files converted_" : ["%n dosya dönüştürüldü","%n dosya dönüştürüldü"],
"Files converted" : "Dosyalar dönüştürüldü",
"Failed to convert files" : "Dosyalar dönüştürülemedi",
"Converting file …" : "Dosya dönüştürülüyor…",
"File successfully converted" : "Dosya dönüştürüldü",

@ -116,6 +116,7 @@ OC.L10N.register(
"General" : "常规",
"Sort favorites first" : "收藏排序优先",
"Sort folders before files" : "将文件夹排在文件前面",
"Enable folder tree view" : "启用文件夹树视图",
"Default view" : "默认视图",
"All files" : "全部文件",
"Personal files" : "个人文件",
@ -139,7 +140,10 @@ OC.L10N.register(
"Show those shortcuts" : "显示快捷键",
"Warnings" : "警告",
"Warn before changing a file extension" : "更改文件扩展名前发出警告",
"Warn before deleting a file" : "删除文件前发出警告",
"WebDAV URL" : "WebDAV URL",
"Create an app password" : "创建应用密码",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "由于此账号已启用双因素身份验证,因此需要进行 WebDAV 身份验证。",
"How to access files using WebDAV" : "如何使用 WebDAV 访问文件",
"Total rows summary" : "总行摘要",
"Toggle selection for all files and folders" : "切换所有文件和文件夹的选择",
@ -265,6 +269,9 @@ OC.L10N.register(
"Failed to convert files: {message}" : "无法转换文件:{message}",
"All files failed to be converted" : "无法转换全部文件",
"One file could not be converted: {message}" : "有一个文件无法转换:{message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["无法转换 %n 个文件"],
"_%n file converted_::_%n files converted_" : ["已转换 %n 个文件"],
"Files converted" : "文件已转换",
"Failed to convert files" : "无法转换文件",
"Converting file …" : "正在转换文件 …",
"File successfully converted" : "文件已成功转换",

@ -114,6 +114,7 @@
"General" : "常规",
"Sort favorites first" : "收藏排序优先",
"Sort folders before files" : "将文件夹排在文件前面",
"Enable folder tree view" : "启用文件夹树视图",
"Default view" : "默认视图",
"All files" : "全部文件",
"Personal files" : "个人文件",
@ -137,7 +138,10 @@
"Show those shortcuts" : "显示快捷键",
"Warnings" : "警告",
"Warn before changing a file extension" : "更改文件扩展名前发出警告",
"Warn before deleting a file" : "删除文件前发出警告",
"WebDAV URL" : "WebDAV URL",
"Create an app password" : "创建应用密码",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "由于此账号已启用双因素身份验证,因此需要进行 WebDAV 身份验证。",
"How to access files using WebDAV" : "如何使用 WebDAV 访问文件",
"Total rows summary" : "总行摘要",
"Toggle selection for all files and folders" : "切换所有文件和文件夹的选择",
@ -263,6 +267,9 @@
"Failed to convert files: {message}" : "无法转换文件:{message}",
"All files failed to be converted" : "无法转换全部文件",
"One file could not be converted: {message}" : "有一个文件无法转换:{message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["无法转换 %n 个文件"],
"_%n file converted_::_%n files converted_" : ["已转换 %n 个文件"],
"Files converted" : "文件已转换",
"Failed to convert files" : "无法转换文件",
"Converting file …" : "正在转换文件 …",
"File successfully converted" : "文件已成功转换",

@ -49,6 +49,7 @@ OC.L10N.register(
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Varsayılan Kerberos alanı, varsayılan olarak \"WORKGROUP\"",
"Kerberos ticket Apache mode" : "Kerberos kaydı Apache kipi",
"Kerberos ticket" : "Kerberos kaydı",
"S3 Storage" : "S3 depolama alanı",
"Bucket" : "Buket",
"Hostname" : "Sunucu adı",
"Port" : "Bağlantı noktası",

@ -47,6 +47,7 @@
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Varsayılan Kerberos alanı, varsayılan olarak \"WORKGROUP\"",
"Kerberos ticket Apache mode" : "Kerberos kaydı Apache kipi",
"Kerberos ticket" : "Kerberos kaydı",
"S3 Storage" : "S3 depolama alanı",
"Bucket" : "Buket",
"Hostname" : "Sunucu adı",
"Port" : "Bağlantı noktası",

@ -49,6 +49,7 @@ OC.L10N.register(
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberos 默认领域默认为“WORKGROUP”",
"Kerberos ticket Apache mode" : "Kerberos 凭证 Apache 模式",
"Kerberos ticket" : "Kerberos 票据",
"S3 Storage" : "S3 存储",
"Bucket" : "Bucket",
"Hostname" : "主机名",
"Port" : "端口",

@ -47,6 +47,7 @@
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberos 默认领域默认为“WORKGROUP”",
"Kerberos ticket Apache mode" : "Kerberos 凭证 Apache 模式",
"Kerberos ticket" : "Kerberos 票据",
"S3 Storage" : "S3 存储",
"Bucket" : "Bucket",
"Hostname" : "主机名",
"Port" : "端口",

@ -20,6 +20,7 @@ OC.L10N.register(
"Cancel" : "İptal",
"Clear reminder" : "Anımsatıcıyı temizle",
"Set reminder" : "Anımsatıcı ayarla",
"Set reminder for " : "Şunun için anımsatıcı ayarla",
"Reminder set" : "Anımsatıcı ayarlandı",
"Custom reminder" : "Özel anımsatıcı",
"Later today" : "Bugün daha sonra",

@ -18,6 +18,7 @@
"Cancel" : "İptal",
"Clear reminder" : "Anımsatıcıyı temizle",
"Set reminder" : "Anımsatıcı ayarla",
"Set reminder for " : "Şunun için anımsatıcı ayarla",
"Reminder set" : "Anımsatıcı ayarlandı",
"Custom reminder" : "Özel anımsatıcı",
"Later today" : "Bugün daha sonra",

@ -474,7 +474,7 @@ export default {
*/
filterByTrustedServer(result) {
const isRemoteEntity = result.value.shareType === ShareType.Remote || result.value.shareType === ShareType.RemoteGroup
if (isRemoteEntity && this.config.showFederatedSharesToTrustedServersAsInternal) {
if (isRemoteEntity && this.config.showFederatedSharesToTrustedServersAsInternal && !this.isExternal) {
return result.value.isTrustedServer === true
}
return true

@ -12,11 +12,13 @@ OC.L10N.register(
"An error occurred while generating your backup codes" : "Yedek kodlar oluşturulurken bir sorun çıktı",
"Backup codes have been generated. {used} of {total} codes have been used." : "Yedek kodları oluşturuldu. {used} / {total} kod kullanılıyor.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Yedek kodlarınızı burada görebilirsiniz. Kodları daha sonra göremeyeceğiniz için bu kodları kaydedin ya da yazdırın.",
"List of backup codes" : "Yedek kodların listesi",
"Regenerate backup codes" : "Yedek kodlarını yeniden oluştur",
"Print backup codes" : "Yedek kodları yazdır",
"Save backup codes" : "Yedek kodları kaydet",
"If you regenerate backup codes, you automatically invalidate old codes." : "Yedek kodlarını yeniden oluşturursanız, eski kodlar geçersiz olur.",
"{name} backup codes" : "{name} yedek kodları",
"Unable to open a new tab for printing" : "Yazdırmak için yeni bir sekme açılamadı",
"Use one of the backup codes you saved when setting up two-factor authentication." : "İki adımlı doğrulamayı ayarlarken yedek kodlarından birini kullanın.",
"Submit" : "Gönder"
},

@ -10,11 +10,13 @@
"An error occurred while generating your backup codes" : "Yedek kodlar oluşturulurken bir sorun çıktı",
"Backup codes have been generated. {used} of {total} codes have been used." : "Yedek kodları oluşturuldu. {used} / {total} kod kullanılıyor.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "Yedek kodlarınızı burada görebilirsiniz. Kodları daha sonra göremeyeceğiniz için bu kodları kaydedin ya da yazdırın.",
"List of backup codes" : "Yedek kodların listesi",
"Regenerate backup codes" : "Yedek kodlarını yeniden oluştur",
"Print backup codes" : "Yedek kodları yazdır",
"Save backup codes" : "Yedek kodları kaydet",
"If you regenerate backup codes, you automatically invalidate old codes." : "Yedek kodlarını yeniden oluşturursanız, eski kodlar geçersiz olur.",
"{name} backup codes" : "{name} yedek kodları",
"Unable to open a new tab for printing" : "Yazdırmak için yeni bir sekme açılamadı",
"Use one of the backup codes you saved when setting up two-factor authentication." : "İki adımlı doğrulamayı ayarlarken yedek kodlarından birini kullanın.",
"Submit" : "Gönder"
},"pluralForm" :"nplurals=2; plural=(n > 1);"

@ -151,9 +151,12 @@ OC.L10N.register(
"Delete configuration" : "删除配置",
"You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "您可以省略协议前缀但如果您要求使用SSL请确保附加 ldaps:// 前缀",
"Host" : "主机",
"ldaps://localhost" : "ldaps://localhost",
"Port" : "端口",
"389" : "389",
"Detect Port" : "检测端口",
"User DN" : "用户 DN",
"uid=agent,dc=example,dc=com" : "uid=agent,dc=example,dc=com",
"For anonymous access, leave DN and Password empty." : "启用匿名访问,将 DN 和密码保留为空。",
"Password" : "密码",
"Save Credentials" : "保存凭据",

@ -149,9 +149,12 @@
"Delete configuration" : "删除配置",
"You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "您可以省略协议前缀但如果您要求使用SSL请确保附加 ldaps:// 前缀",
"Host" : "主机",
"ldaps://localhost" : "ldaps://localhost",
"Port" : "端口",
"389" : "389",
"Detect Port" : "检测端口",
"User DN" : "用户 DN",
"uid=agent,dc=example,dc=com" : "uid=agent,dc=example,dc=com",
"For anonymous access, leave DN and Password empty." : "启用匿名访问,将 DN 和密码保留为空。",
"Password" : "密码",
"Save Credentials" : "保存凭据",

@ -27,6 +27,7 @@ OC.L10N.register(
"%s accessed %s" : "%s erişildi %s",
"%s renamed %s" : "%s yeniden adlandırıldı%s",
"%s copied %s" : "%s kopyalandı%s",
"%1$s assigned %2$s to %3$s" : "%1$s atandı %2$s => %3$s",
"Operation #%s does not exist" : "#%s işlemi bulunamadı",
"Entity %s is invalid" : "%s varlığı geçersiz",
"Entity %s does not exist" : "%s varlığı bulunamadı",

@ -25,6 +25,7 @@
"%s accessed %s" : "%s erişildi %s",
"%s renamed %s" : "%s yeniden adlandırıldı%s",
"%s copied %s" : "%s kopyalandı%s",
"%1$s assigned %2$s to %3$s" : "%1$s atandı %2$s => %3$s",
"Operation #%s does not exist" : "#%s işlemi bulunamadı",
"Entity %s is invalid" : "%s varlığı geçersiz",
"Entity %s does not exist" : "%s varlığı bulunamadı",

@ -12,7 +12,7 @@ ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD
DBCONFIGS="sqlite mysql pgsql oci"
PHPUNIT=$(which phpunit)
PHPUNIT="$PWD/lib/composer/bin/phpunit"
_XDEBUG_CONFIG=$XDEBUG_CONFIG
unset XDEBUG_CONFIG
@ -28,13 +28,8 @@ function print_syntax {
}
if ! [ -x "$PHPUNIT" ]; then
echo "phpunit executable not found, trying local one from build/integration" >&2
if [ -x "$PWD/build/integration/vendor/phpunit/phpunit/phpunit" ]; then
PHPUNIT="$PWD/build/integration/vendor/phpunit/phpunit/phpunit"
else
echo "phpunit executable not found, please install phpunit version >= 9.0" >&2
exit 3
fi
echo "phpunit executable not found, please run 'composer install' in the root directory first." >&2
exit 3
fi
PHPUNIT_VERSION=$("$PHPUNIT" --version | cut -d" " -f2)

@ -53,7 +53,7 @@
"jquery": "~3.7",
"jquery-ui": "1.14.1",
"jquery-ui-dist": "^1.13.3",
"libphonenumber-js": "^1.12.29",
"libphonenumber-js": "^1.12.31",
"lodash": "^4.17.21",
"marked": "^17.0.1",
"moment": "^2.30.1",
@ -97,7 +97,7 @@
"@testing-library/user-event": "^14.6.1",
"@testing-library/vue": "^5.8.3",
"@vitejs/plugin-vue2": "^2.3.4",
"@vitest/coverage-v8": "^4.0.14",
"@vitest/coverage-v8": "^4.0.15",
"@vue/test-utils": "^1.3.5",
"@vue/tsconfig": "~0.5.1",
"babel-loader-exclude-node-modules-except": "^1.2.1",
@ -112,7 +112,7 @@
"regextras": "^0.8.0",
"sass": "^1.94.2",
"typescript": "^5.9.2",
"vite": "^7.2.4",
"vite": "^7.2.7",
"vitest": "^4.0.13",
"vue-loader": "^15.11.1",
"vue-template-compiler": "^2.7.16",
@ -5308,14 +5308,14 @@
}
},
"node_modules/@vitest/coverage-v8": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.14.tgz",
"integrity": "sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz",
"integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^1.0.2",
"@vitest/utils": "4.0.14",
"@vitest/utils": "4.0.15",
"ast-v8-to-istanbul": "^0.3.8",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
@ -5330,8 +5330,8 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"@vitest/browser": "4.0.14",
"vitest": "4.0.14"
"@vitest/browser": "4.0.15",
"vitest": "4.0.15"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@ -5355,16 +5355,16 @@
}
},
"node_modules/@vitest/expect": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.14.tgz",
"integrity": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz",
"integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@types/chai": "^5.2.2",
"@vitest/spy": "4.0.14",
"@vitest/utils": "4.0.14",
"@vitest/spy": "4.0.15",
"@vitest/utils": "4.0.15",
"chai": "^6.2.1",
"tinyrainbow": "^3.0.3"
},
@ -5373,13 +5373,13 @@
}
},
"node_modules/@vitest/mocker": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.14.tgz",
"integrity": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz",
"integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "4.0.14",
"@vitest/spy": "4.0.15",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.21"
},
@ -5410,9 +5410,9 @@
}
},
"node_modules/@vitest/pretty-format": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.14.tgz",
"integrity": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz",
"integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -5423,13 +5423,13 @@
}
},
"node_modules/@vitest/runner": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.14.tgz",
"integrity": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz",
"integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/utils": "4.0.14",
"@vitest/utils": "4.0.15",
"pathe": "^2.0.3"
},
"funding": {
@ -5437,13 +5437,13 @@
}
},
"node_modules/@vitest/snapshot": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.14.tgz",
"integrity": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz",
"integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.0.14",
"@vitest/pretty-format": "4.0.15",
"magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
@ -5452,9 +5452,9 @@
}
},
"node_modules/@vitest/spy": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.14.tgz",
"integrity": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz",
"integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==",
"dev": true,
"license": "MIT",
"funding": {
@ -5462,13 +5462,13 @@
}
},
"node_modules/@vitest/utils": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.14.tgz",
"integrity": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz",
"integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.0.14",
"@vitest/pretty-format": "4.0.15",
"tinyrainbow": "^3.0.3"
},
"funding": {
@ -11464,9 +11464,9 @@
}
},
"node_modules/libphonenumber-js": {
"version": "1.12.29",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.29.tgz",
"integrity": "sha512-P2aLrbeqHbmh8+9P35LXQfXOKc7XJ0ymUKl7tyeyQjdRNfzunXWxQXGc4yl3fUf28fqLRfPY+vIVvFXK7KEBTw==",
"version": "1.12.31",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz",
"integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==",
"license": "MIT"
},
"node_modules/linkify-string": {
@ -16461,11 +16461,14 @@
"license": "MIT"
},
"node_modules/tinyexec": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
"integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
"integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
"dev": true,
"license": "MIT"
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
@ -17296,9 +17299,9 @@
}
},
"node_modules/vite": {
"version": "7.2.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz",
"integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==",
"version": "7.2.7",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz",
"integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
@ -17415,19 +17418,19 @@
}
},
"node_modules/vitest": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.14.tgz",
"integrity": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==",
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz",
"integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/expect": "4.0.14",
"@vitest/mocker": "4.0.14",
"@vitest/pretty-format": "4.0.14",
"@vitest/runner": "4.0.14",
"@vitest/snapshot": "4.0.14",
"@vitest/spy": "4.0.14",
"@vitest/utils": "4.0.14",
"@vitest/expect": "4.0.15",
"@vitest/mocker": "4.0.15",
"@vitest/pretty-format": "4.0.15",
"@vitest/runner": "4.0.15",
"@vitest/snapshot": "4.0.15",
"@vitest/spy": "4.0.15",
"@vitest/utils": "4.0.15",
"es-module-lexer": "^1.7.0",
"expect-type": "^1.2.2",
"magic-string": "^0.30.21",
@ -17436,7 +17439,7 @@
"picomatch": "^4.0.3",
"std-env": "^3.10.0",
"tinybench": "^2.9.0",
"tinyexec": "^0.3.2",
"tinyexec": "^1.0.2",
"tinyglobby": "^0.2.15",
"tinyrainbow": "^3.0.3",
"vite": "^6.0.0 || ^7.0.0",
@ -17455,10 +17458,10 @@
"@edge-runtime/vm": "*",
"@opentelemetry/api": "^1.9.0",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
"@vitest/browser-playwright": "4.0.14",
"@vitest/browser-preview": "4.0.14",
"@vitest/browser-webdriverio": "4.0.14",
"@vitest/ui": "4.0.14",
"@vitest/browser-playwright": "4.0.15",
"@vitest/browser-preview": "4.0.15",
"@vitest/browser-webdriverio": "4.0.15",
"@vitest/ui": "4.0.15",
"happy-dom": "*",
"jsdom": "*"
},

@ -69,7 +69,7 @@
"jquery": "~3.7",
"jquery-ui": "1.14.1",
"jquery-ui-dist": "^1.13.3",
"libphonenumber-js": "^1.12.29",
"libphonenumber-js": "^1.12.31",
"lodash": "^4.17.21",
"marked": "^17.0.1",
"moment": "^2.30.1",
@ -113,7 +113,7 @@
"@testing-library/user-event": "^14.6.1",
"@testing-library/vue": "^5.8.3",
"@vitejs/plugin-vue2": "^2.3.4",
"@vitest/coverage-v8": "^4.0.14",
"@vitest/coverage-v8": "^4.0.15",
"@vue/test-utils": "^1.3.5",
"@vue/tsconfig": "~0.5.1",
"babel-loader-exclude-node-modules-except": "^1.2.1",
@ -128,7 +128,7 @@
"regextras": "^0.8.0",
"sass": "^1.94.2",
"typescript": "^5.9.2",
"vite": "^7.2.4",
"vite": "^7.2.7",
"vitest": "^4.0.13",
"vue-loader": "^15.11.1",
"vue-template-compiler": "^2.7.16",

@ -1,15 +0,0 @@
{
"config": {
"platform": {
"php": "8.2"
},
"sort-packages": true
},
"require-dev": {
"behat/behat": "^3.15",
"guzzlehttp/guzzle": "^7.9",
"phpunit/phpunit": "^11.5",
"sabre/dav": "^4.7",
"symfony/event-dispatcher": "^7.3"
}
}

@ -10,7 +10,7 @@ use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use PHPUnit\Framework\Assert;
use Psr\Http\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait AppConfiguration {
/** @var string */

@ -10,7 +10,7 @@ use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\ServerException;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait Auth {
/** @var string */

@ -6,7 +6,7 @@
*/
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait Avatar {
/** @var string * */

@ -13,7 +13,7 @@ use GuzzleHttp\Exception\ServerException;
use PHPUnit\Framework\Assert;
use Psr\Http\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait BasicStructure {
use Auth;

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

@ -9,7 +9,7 @@ use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**
* Capabilities context.

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;

@ -11,7 +11,7 @@ use Behat\Gherkin\Node\TableNode;
use GuzzleHttp\Client;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class CollaborationContext implements Context {
use Provisioning;

@ -7,7 +7,7 @@
*/
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait CommandLine {
/** @var int return code of last command */

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use Behat\Behat\Context\Exception\ContextNotFoundException;
use Behat\Behat\Hook\Scope\BeforeScenarioScope;

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class CommentsContext implements \Behat\Behat\Context\Context {
/** @var string */

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;

@ -8,7 +8,7 @@
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class DavFeatureContext implements Context, SnippetAcceptingContext {
use AppConfiguration;

@ -7,7 +7,7 @@
use PHPUnit\Framework\Assert;
use Psr\Http\Message\StreamInterface;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait Download {
/** @var string * */

@ -7,7 +7,7 @@
use Behat\Gherkin\Node\TableNode;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait ExternalStorage {
private array $storageIds = [];

@ -8,7 +8,7 @@
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**
* Features context.

@ -10,7 +10,7 @@ use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\TableNode;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**
* Federation context.

@ -8,7 +8,7 @@ use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use GuzzleHttp\Client;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class FilesDropContext implements Context, SnippetAcceptingContext {
use WebDav;

@ -7,7 +7,7 @@
use Behat\Behat\Context\Context;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**

@ -11,7 +11,7 @@ use Behat\Step\When;
use PHPUnit\Framework\Assert;
use Sabre\DAV\Client as SClient;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class MetadataContext implements Context {
private string $davPath = '/remote.php/dav';

@ -5,7 +5,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use Behat\Behat\Context\Context;
use GuzzleHttp\BodySummarizer;

@ -11,7 +11,7 @@ use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait Provisioning {
use BasicStructure;

@ -8,7 +8,7 @@ use Behat\Behat\Context\Context;
use OCP\Http\Client\IClientService;
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**
* Remote context.

@ -7,7 +7,7 @@
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
class RoutingContext implements Context, SnippetAcceptingContext {
use Provisioning;

@ -6,7 +6,7 @@
*/
use Behat\Behat\Context\Context;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**

@ -8,7 +8,7 @@
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**

@ -10,7 +10,7 @@ use GuzzleHttp\Client;
use PHPUnit\Framework\Assert;
use Psr\Http\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';

@ -7,7 +7,7 @@
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
use Behat\Gherkin\Node\TableNode;
use GuzzleHttp\Client;

@ -4,7 +4,7 @@
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait Theming {

@ -8,7 +8,7 @@
use PHPUnit\Framework\Assert;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
/**
* Trashbin functions

@ -12,7 +12,7 @@ use Psr\Http\Message\ResponseInterface;
use Sabre\DAV\Client as SClient;
use Sabre\DAV\Xml\Property\ResourceType;
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/autoload.php';
trait WebDav {

@ -0,0 +1,9 @@
<?php
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
require __DIR__ . '/../../../../vendor-bin/behat/vendor/autoload.php';
require __DIR__ . '/../../../../3rdparty/autoload.php';

@ -151,6 +151,9 @@ function prepareDocker() {
docker cp - $NEXTCLOUD_LOCAL_CONTAINER:/nextcloud/ < "$NEXTCLOUD_LOCAL_TAR"
docker exec $NEXTCLOUD_LOCAL_CONTAINER chown -R www-data:www-data /nextcloud
# Install Nextcloud in the container
docker exec -w /nextcloud $NEXTCLOUD_LOCAL_CONTAINER composer install
# Database options are needed only when a database other than SQLite is
# used.
NEXTCLOUD_LOCAL_CONTAINER_INSTALL_DATABASE_OPTIONS=""
@ -159,7 +162,7 @@ function prepareDocker() {
fi
echo "Installing Nextcloud in the container"
docker exec --user www-data $NEXTCLOUD_LOCAL_CONTAINER bash -c "cd nextcloud && php occ maintenance:install --admin-pass=admin $NEXTCLOUD_LOCAL_CONTAINER_INSTALL_DATABASE_OPTIONS"
docker exec --user www-data --workdir /nextcloud $NEXTCLOUD_LOCAL_CONTAINER php occ maintenance:install --admin-pass=admin $NEXTCLOUD_LOCAL_CONTAINER_INSTALL_DATABASE_OPTIONS
}
# Removes/stops temporal elements created/started by this script.
@ -200,9 +203,8 @@ trap cleanUp EXIT
cd "$(dirname $0)"
# "--image XXX" option can be provided to set the Docker image to use to run
# the integration tests (one of the "nextcloudci/phpX.Y:phpX.Y-Z" or
# "ghcr.io/nextcloud/continuous-integration-integration-phpX.Y:latest" images).
NEXTCLOUD_LOCAL_IMAGE="ghcr.io/nextcloud/continuous-integration-integration-php8.2:latest"
# the integration tests (one of the "nextcloud/continuous-integration-phpX.Y:latest" images).
NEXTCLOUD_LOCAL_IMAGE="ghcr.io/nextcloud/continuous-integration-php8.3:latest"
if [ "$1" = "--image" ]; then
NEXTCLOUD_LOCAL_IMAGE=$2
@ -248,4 +250,4 @@ prepareDocker
echo "Running tests"
# --tty is needed to get colourful output.
docker exec --tty --user www-data $NEXTCLOUD_LOCAL_CONTAINER bash -c "cd nextcloud/build/integration && ./run.sh $SCENARIO_TO_RUN"
docker exec --tty --user www-data -w "/nextcloud/build/integration" $NEXTCLOUD_LOCAL_CONTAINER bash -c "./run.sh $SCENARIO_TO_RUN"

@ -3,7 +3,13 @@
# SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc.
# SPDX-License-Identifier: AGPL-3.0-only
#
BEHAT_EXECUTABLE=../../lib/composer/bin/behat
if [ ! -f "$BEHAT_EXECUTABLE" ]; then
echo "Behat executable not found. Please run 'composer install' in the root directory first." >&2
exit 1
fi
OC_PATH=../../
OCC=${OC_PATH}occ
TAGS=""
@ -38,8 +44,6 @@ else
fi
NC_DATADIR=$($OCC config:system:get datadirectory)
composer install
# avoid port collision on jenkins - use $EXECUTOR_NUMBER
if [ -z "$EXECUTOR_NUMBER" ]; then
EXECUTOR_NUMBER=0
@ -88,7 +92,14 @@ if [ "$INSTALLED" == "true" ]; then
fi
vendor/bin/behat --strict --colors -f junit -f pretty $TAGS $SCENARIO_TO_RUN
$BEHAT_EXECUTABLE \
--strict \
--colors \
-f junit \
-f pretty \
$TAGS \
$SCENARIO_TO_RUN
RESULT=$?
if [ "$INSTALLED" == "true" ]; then

@ -3641,12 +3641,6 @@
<InvalidOperand>
<code><![CDATA[$user]]></code>
</InvalidOperand>
<RedundantCondition>
<code><![CDATA[get_class($provider) !== 'OCA\Files_Sharing\MountProvider']]></code>
</RedundantCondition>
<TypeDoesNotContainType>
<code><![CDATA[get_class($provider) === 'OCA\Files_Sharing\MountProvider']]></code>
</TypeDoesNotContainType>
</file>
<file src="lib/private/Files/Config/UserMountCache.php">
<InvalidReturnType>

@ -7,3 +7,6 @@
// PHP 8.4
function array_find(array $array, callable $callback) {}
// PHP 8.5
function array_any(array $array, callable $callback): bool {}

17
composer.lock generated

@ -4,21 +4,21 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d065a83a3541ae968e174ccc250e446c",
"content-hash": "6ddd830a124a1e3f11c8f73901b0d0e6",
"packages": [],
"packages-dev": [
{
"name": "bamarni/composer-bin-plugin",
"version": "1.8.2",
"version": "1.8.3",
"source": {
"type": "git",
"url": "https://github.com/bamarni/composer-bin-plugin.git",
"reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880"
"reference": "e7ef9e012667327516c24e5fad9903a3bc91389d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880",
"reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880",
"url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/e7ef9e012667327516c24e5fad9903a3bc91389d",
"reference": "e7ef9e012667327516c24e5fad9903a3bc91389d",
"shasum": ""
},
"require": {
@ -31,7 +31,7 @@
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^8.5 || ^9.5",
"phpunit/phpunit": "^8.5 || ^9.6 || ^10.0",
"symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0"
@ -60,9 +60,9 @@
],
"support": {
"issues": "https://github.com/bamarni/composer-bin-plugin/issues",
"source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.2"
"source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.3"
},
"time": "2022-10-31T08:38:03+00:00"
"time": "2025-11-24T19:20:55+00:00"
}
],
"aliases": [],
@ -72,6 +72,7 @@
"prefer-lowest": false,
"platform": {
"php": "^8.2",
"ext-apcu": "*",
"ext-ctype": "*",
"ext-curl": "*",
"ext-dom": "*",

@ -58,12 +58,7 @@ class Install extends Command {
$errors = $sysInfo['errors'];
if (count($errors) > 0) {
$this->printErrors($output, $errors);
// ignore the OS X setup warning
if (count($errors) !== 1
|| (string)$errors[0]['error'] !== 'Mac OS X is not supported and Nextcloud will not work properly on this platform. Use it at your own risk!') {
return 1;
}
return 1;
}
// validate user input

@ -42,6 +42,7 @@ OC.L10N.register(
"Not found" : "Bulunamadı",
"Node is locked" : "Düğüm kilitlenmiş",
"Bad request" : "İstek hatalı",
"Input text is too long" : "Giriş yazısı çok uzun",
"Requested task type does not exist" : "İstenilen görev türü bulunamadı",
"Necessary language model provider is not available" : "Gerekli dil modeli sağlayıcısı kullanılamıyor",
"No text to image provider is available" : "Kullanılabilecek bir yazıdan görsel oluşturma hizmeti sağlayıcısı yok",
@ -262,6 +263,7 @@ OC.L10N.register(
"An internal error occurred." : "İçeride bir sorun çıktı.",
"Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da BT yöneticiniz ile görüşün.",
"Password" : "Parola",
"Remember me" : "Beni hatırla",
"Log in with a device" : "Bir aygıt ile oturum açın",
"Login or email" : "Kullanıcı adı ya da e-posta",
"Your account is not setup for passwordless login." : "Hesabınız parola kullanmadan oturum açılacak şekilde ayarlanmamış.",

@ -40,6 +40,7 @@
"Not found" : "Bulunamadı",
"Node is locked" : "Düğüm kilitlenmiş",
"Bad request" : "İstek hatalı",
"Input text is too long" : "Giriş yazısı çok uzun",
"Requested task type does not exist" : "İstenilen görev türü bulunamadı",
"Necessary language model provider is not available" : "Gerekli dil modeli sağlayıcısı kullanılamıyor",
"No text to image provider is available" : "Kullanılabilecek bir yazıdan görsel oluşturma hizmeti sağlayıcısı yok",
@ -260,6 +261,7 @@
"An internal error occurred." : "İçeride bir sorun çıktı.",
"Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da BT yöneticiniz ile görüşün.",
"Password" : "Parola",
"Remember me" : "Beni hatırla",
"Log in with a device" : "Bir aygıt ile oturum açın",
"Login or email" : "Kullanıcı adı ya da e-posta",
"Your account is not setup for passwordless login." : "Hesabınız parola kullanmadan oturum açılacak şekilde ayarlanmamış.",

@ -42,6 +42,7 @@ OC.L10N.register(
"Not found" : "未找到",
"Node is locked" : "节点已锁定",
"Bad request" : "请求错误",
"Input text is too long" : "输入文本太长",
"Requested task type does not exist" : "请求的任务类型不存在",
"Necessary language model provider is not available" : "无必要的语言模型提供程序",
"No text to image provider is available" : "没有可用的文字转图片提供者",
@ -262,6 +263,7 @@ OC.L10N.register(
"An internal error occurred." : "发生了内部错误。",
"Please try again or contact your administrator." : "请重试或联系您的管理员。",
"Password" : "密码",
"Remember me" : "记住我",
"Log in with a device" : "使用设备登录",
"Login or email" : "账号或电子邮箱",
"Your account is not setup for passwordless login." : "你的账号未设置无密码登录。",
@ -294,6 +296,7 @@ OC.L10N.register(
"Installing apps …" : "正在安装应用 …",
"Install recommended apps" : "安装推荐的应用",
"Online" : "在线",
"Away" : "离开",
"Busy" : "忙碌",
"Do not disturb" : "勿扰",
"Mute all notifications" : "静音所有通知",

@ -40,6 +40,7 @@
"Not found" : "未找到",
"Node is locked" : "节点已锁定",
"Bad request" : "请求错误",
"Input text is too long" : "输入文本太长",
"Requested task type does not exist" : "请求的任务类型不存在",
"Necessary language model provider is not available" : "无必要的语言模型提供程序",
"No text to image provider is available" : "没有可用的文字转图片提供者",
@ -260,6 +261,7 @@
"An internal error occurred." : "发生了内部错误。",
"Please try again or contact your administrator." : "请重试或联系您的管理员。",
"Password" : "密码",
"Remember me" : "记住我",
"Log in with a device" : "使用设备登录",
"Login or email" : "账号或电子邮箱",
"Your account is not setup for passwordless login." : "你的账号未设置无密码登录。",
@ -292,6 +294,7 @@
"Installing apps …" : "正在安装应用 …",
"Install recommended apps" : "安装推荐的应用",
"Online" : "在线",
"Away" : "离开",
"Busy" : "忙碌",
"Do not disturb" : "勿扰",
"Mute all notifications" : "静音所有通知",

@ -30,7 +30,7 @@
:label="t('core', 'Search apps, files, tags, messages') + '...'"
@update:value="debouncedFind" />
<div class="unified-search-modal__filters" data-cy-unified-search-filters>
<NcActions :menu-name="t('core', 'Places')" :open.sync="providerActionMenuIsOpen" data-cy-unified-search-filter="places">
<NcActions :open.sync="providerActionMenuIsOpen" :menu-name="t('core', 'Places')" data-cy-unified-search-filter="places">
<template #icon>
<IconListBox :size="20" />
</template>
@ -47,7 +47,7 @@
{{ provider.name }}
</NcActionButton>
</NcActions>
<NcActions :menu-name="t('core', 'Date')" :open.sync="dateActionMenuIsOpen" data-cy-unified-search-filter="date">
<NcActions :open.sync="dateActionMenuIsOpen" :menu-name="t('core', 'Date')" data-cy-unified-search-filter="date">
<template #icon>
<IconCalendarRange :size="20" />
</template>
@ -135,7 +135,8 @@
<h3 class="hidden-visually">
{{ t('core', 'Results') }}
</h3>
<div v-for="providerResult in results" :key="providerResult.id" class="result">
<!-- Filtered results section -->
<div v-for="providerResult in filteredResults" :key="providerResult.id" class="result">
<h4 :id="`unified-search-result-${providerResult.id}`" class="result-title">
{{ providerResult.name }}
</h4>
@ -160,6 +161,37 @@
</NcButton>
</div>
</div>
<!-- Unfiltered results section -->
<template v-if="unfilteredResults.length > 0">
<div class="unified-search-modal__unfiltered-header">
<span class="unified-search-modal__unfiltered-label">{{ t('core', 'Partial matches') }}</span>
</div>
<div v-for="providerResult in unfilteredResults" :key="`unfiltered-${providerResult.id}`" class="result result--unfiltered">
<h4 :id="`unified-search-result-unfiltered-${providerResult.id}`" class="result-title">
{{ providerResult.name }}
</h4>
<ul class="result-items" :aria-labelledby="`unified-search-result-unfiltered-${providerResult.id}`">
<SearchResult
v-for="(result, index) in providerResult.results"
:key="index"
v-bind="result" />
</ul>
<div class="result-footer">
<NcButton v-if="providerResult.results.length === providerResult.limit" variant="tertiary-no-background" @click="loadMoreResultsForProvider(providerResult)">
{{ t('core', 'Load more results') }}
<template #icon>
<IconDotsHorizontal :size="20" />
</template>
</NcButton>
<NcButton v-if="providerResult.inAppSearch" alignment="end-reverse" variant="tertiary-no-background">
{{ t('core', 'Search in') }} {{ providerResult.name }}
<template #icon>
<IconArrowRight :size="20" />
</template>
</NcButton>
</div>
</div>
</template>
</div>
</NcDialog>
</template>
@ -342,6 +374,50 @@ export default defineComponent({
hasExternalResources() {
return this.providers.some((provider) => provider.isExternalProvider)
},
hasContentFilters() {
return this.filters.some((filter) => filter.type === 'date' || filter.type === 'person')
},
filteredResults() {
const isInFolderAtRoot = (result) => {
if (result.id !== 'in-folder') {
return false
}
const path = result.extraParams?.path
return !path || path === '/' || path === ''
}
if (!this.hasContentFilters) {
return this.results.filter((result) => !isInFolderAtRoot(result))
}
return this.results.filter((result) => result.supportsActiveFilters === true && !isInFolderAtRoot(result))
},
filteredResultUrls() {
const urls = new Set()
this.filteredResults.forEach((provider) => {
provider.results.forEach((entry) => {
if (entry.resourceUrl) {
urls.add(entry.resourceUrl)
}
})
})
return urls
},
unfilteredResults() {
if (!this.hasContentFilters) {
return []
}
return this.results
.filter((result) => result.supportsActiveFilters === false)
.map((provider) => ({
...provider,
results: provider.results.filter((entry) => !this.filteredResultUrls.has(entry.resourceUrl)),
}))
.filter((provider) => provider.results.length > 0)
},
},
watch: {
@ -444,6 +520,16 @@ export default defineComponent({
// This block of filter checks should be dynamic somehow and should be handled in
// nextcloud/search lib
const contentFilterTypes = this.filters
.filter((f) => f.type !== 'provider')
.map((f) => f.type)
const supportsActiveFilters = contentFilterTypes.length === 0
|| contentFilterTypes.every((type) => this.providerIsCompatibleWithFilters(provider, [type]))
const baseProvider = provider.searchFrom
? this.providers.find((p) => p.id === provider.searchFrom) ?? provider
: provider
const activeFilters = this.filters.filter((filter) => {
return filter.type !== 'provider' && this.providerIsCompatibleWithFilters(provider, [filter.type])
})
@ -451,13 +537,13 @@ export default defineComponent({
activeFilters.forEach((filter) => {
switch (filter.type) {
case 'date':
if (provider.filters?.since && provider.filters?.until) {
if (baseProvider.filters?.since && baseProvider.filters?.until) {
params.since = this.dateFilter.startFrom
params.until = this.dateFilter.endAt
}
break
case 'person':
if (provider.filters?.person) {
if (baseProvider.filters?.person) {
params.person = this.personFilter.user
}
break
@ -484,6 +570,7 @@ export default defineComponent({
...provider,
results: response.data.ocs.data.entries,
limit: params.limit ?? 5,
supportsActiveFilters,
})
unifiedSearchLogger.debug('Unified search results:', { results: this.results, newResults })
@ -567,10 +654,6 @@ export default defineComponent({
this.filters[existingPersonFilter].name = person.displayName
}
this.providers.forEach(async (provider, index) => {
this.providers[index].disabled = !(await this.providerIsCompatibleWithFilters(provider, ['person']))
})
this.debouncedFind(this.searchQuery)
unifiedSearchLogger.debug('Person filter applied', { person })
},
@ -628,7 +711,6 @@ export default defineComponent({
for (let i = 0; i < this.filters.length; i++) {
if (this.filters[i].id === filter.id) {
this.filters.splice(i, 1)
this.enableAllProviders()
break
}
}
@ -669,9 +751,6 @@ export default defineComponent({
this.filters.push(this.dateFilter)
}
this.providers.forEach(async (provider, index) => {
this.providers[index].disabled = !(await this.providerIsCompatibleWithFilters(provider, ['since', 'until']))
})
this.debouncedFind(this.searchQuery)
},
@ -774,8 +853,20 @@ export default defineComponent({
return flattenedArray
},
async providerIsCompatibleWithFilters(provider, filterIds) {
return filterIds.every((filterId) => provider.filters?.[filterId] !== undefined)
providerIsCompatibleWithFilters(provider, filterIds) {
const baseProvider = provider.searchFrom
? this.providers.find((p) => p.id === provider.searchFrom) ?? provider
: provider
return filterIds.every((filterId) => {
switch (filterId) {
case 'date':
return baseProvider.filters?.since !== undefined && baseProvider.filters?.until !== undefined
case 'person':
return baseProvider.filters?.person !== undefined
default:
return baseProvider.filters?.[filterId] !== undefined
}
})
},
async enableAllProviders() {
@ -867,9 +958,27 @@ export default defineComponent({
align-items: center;
display: flex;
}
&--unfiltered {
opacity: 0.7;
}
}
}
&__unfiltered-header {
display: flex;
flex-direction: column;
gap: 2px;
margin-block: 16px 8px;
padding-block: 12px 0;
border-top: 1px solid var(--color-border);
}
&__unfiltered-label {
font-weight: bold;
color: var(--color-text-maxcontrast);
}
}
.filter-button__icon {

2
dist/5230-5230.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
5230-5230.js.license

2
dist/861-861.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
861-861.js.license

@ -66,7 +66,7 @@ This file is generated from multiple sources. Included packages:
- version: 7.7.3
- license: ISC
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT
- vite-plugin-node-polyfills
- version: 0.24.0

@ -66,7 +66,7 @@ This file is generated from multiple sources. Included packages:
- version: 7.7.3
- license: ISC
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT
- vite-plugin-node-polyfills
- version: 0.24.0

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -17,5 +17,5 @@ This file is generated from multiple sources. Included packages:
- version: 2.30.1
- license: MIT
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT

@ -17,5 +17,5 @@ This file is generated from multiple sources. Included packages:
- version: 2.30.1
- license: MIT
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT

@ -464,7 +464,7 @@ This file is generated from multiple sources. Included packages:
- version: 3.7.1
- license: MIT
- libphonenumber-js
- version: 1.12.29
- version: 1.12.31
- license: MIT
- linkifyjs
- version: 4.3.2

File diff suppressed because one or more lines are too long

@ -12,7 +12,7 @@ This file is generated from multiple sources. Included packages:
- version: 1.0.0
- license: AGPL-3.0-or-later
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT
- vuex
- version: 4.1.0

@ -12,7 +12,7 @@ This file is generated from multiple sources. Included packages:
- version: 1.0.0
- license: AGPL-3.0-or-later
- vite
- version: 7.2.4
- version: 7.2.7
- license: MIT
- vuex
- version: 4.1.0

@ -420,7 +420,9 @@ return array(
'OCP\\Files\\Config\\ICachedMountInfo' => $baseDir . '/lib/public/Files/Config/ICachedMountInfo.php',
'OCP\\Files\\Config\\IHomeMountProvider' => $baseDir . '/lib/public/Files/Config/IHomeMountProvider.php',
'OCP\\Files\\Config\\IMountProvider' => $baseDir . '/lib/public/Files/Config/IMountProvider.php',
'OCP\\Files\\Config\\IMountProviderArgs' => $baseDir . '/lib/public/Files/Config/IMountProviderArgs.php',
'OCP\\Files\\Config\\IMountProviderCollection' => $baseDir . '/lib/public/Files/Config/IMountProviderCollection.php',
'OCP\\Files\\Config\\IPartialMountProvider' => $baseDir . '/lib/public/Files/Config/IPartialMountProvider.php',
'OCP\\Files\\Config\\IRootMountProvider' => $baseDir . '/lib/public/Files/Config/IRootMountProvider.php',
'OCP\\Files\\Config\\IUserMountCache' => $baseDir . '/lib/public/Files/Config/IUserMountCache.php',
'OCP\\Files\\ConnectionLostException' => $baseDir . '/lib/public/Files/ConnectionLostException.php',

@ -461,7 +461,9 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Files\\Config\\ICachedMountInfo' => __DIR__ . '/../../..' . '/lib/public/Files/Config/ICachedMountInfo.php',
'OCP\\Files\\Config\\IHomeMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IHomeMountProvider.php',
'OCP\\Files\\Config\\IMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProvider.php',
'OCP\\Files\\Config\\IMountProviderArgs' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProviderArgs.php',
'OCP\\Files\\Config\\IMountProviderCollection' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProviderCollection.php',
'OCP\\Files\\Config\\IPartialMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IPartialMountProvider.php',
'OCP\\Files\\Config\\IRootMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IRootMountProvider.php',
'OCP\\Files\\Config\\IUserMountCache' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IUserMountCache.php',
'OCP\\Files\\ConnectionLostException' => __DIR__ . '/../../..' . '/lib/public/Files/ConnectionLostException.php',

@ -160,6 +160,7 @@ OC.L10N.register(
"Oracle connection could not be established" : "Oracle ile bağlantı kurulamadı",
"Oracle Login and/or password not valid" : "Oracle kullanıcı adı ve/veya parolası geçersiz",
"PostgreSQL Login and/or password not valid" : "PostgreSQL kullanıcı adı ve/veya parolası geçersiz",
"macOS is not supported and %s will not work properly on this platform. Use it at your own risk!" : "macOS desteklenmiyor ve %s bu platformda düzgün çalışmayacak. Kullanmaktan doğacak riskler size aittir!",
"For the best results, please consider using a GNU/Linux server instead." : "En iyi sonucu almak için GNU/Linux sunucusu kullanın.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Bu %s kopyası 32 bit PHP ortamında çalıştırılıyor ve open_basedir seçeneği php.ini dosyasından ayarlanmış gibi görünüyor. Bu yapılandırma 4 GB boyutundan büyük dosyalarda sorun çıkarır ve kullanılması önerilmez.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Lütfen php.ini dosyasındaki open_basedir ayarını kaldırın ya da 64-bit PHP sürümüne geçin.",

Some files were not shown because too many files have changed in this diff Show More