aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/composer/autoload_classmap.php2
-rw-r--r--lib/composer/composer/autoload_static.php2
-rw-r--r--lib/l10n/es.js12
-rw-r--r--lib/l10n/es.json12
-rw-r--r--lib/l10n/es_CL.js1
-rw-r--r--lib/l10n/es_CL.json1
-rw-r--r--lib/l10n/et_EE.js32
-rw-r--r--lib/l10n/et_EE.json32
-rw-r--r--lib/l10n/fr.js13
-rw-r--r--lib/l10n/fr.json13
-rw-r--r--lib/l10n/sw.js3
-rw-r--r--lib/l10n/sw.json3
-rw-r--r--lib/l10n/uk.js112
-rw-r--r--lib/l10n/uk.json112
-rw-r--r--lib/private/App/AppStore/Fetcher/Fetcher.php2
-rw-r--r--lib/private/AppConfig.php59
-rw-r--r--lib/private/AppFramework/Bootstrap/RegistrationContext.php3
-rw-r--r--lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php6
-rw-r--r--lib/private/Collaboration/Collaborators/Search.php4
-rw-r--r--lib/private/Config/Lexicon/CoreConfigLexicon.php43
-rw-r--r--lib/private/DB/ConnectionFactory.php38
-rw-r--r--lib/private/Federation/CloudIdManager.php47
-rw-r--r--lib/private/Files/Filesystem.php5
-rw-r--r--lib/private/Lockdown/Filesystem/NullStorage.php2
-rw-r--r--lib/private/Server.php4
-rw-r--r--lib/private/Share/Constants.php49
-rw-r--r--lib/private/Share20/DefaultShareProvider.php32
-rw-r--r--lib/private/Share20/LegacyHooks.php2
-rw-r--r--lib/private/Share20/Manager.php29
-rw-r--r--lib/private/Share20/Share.php20
-rw-r--r--lib/private/Template/JSConfigHelper.php2
-rw-r--r--lib/public/Calendar/ICreateFromString.php24
-rw-r--r--lib/public/Config/BeforePreferenceDeletedEvent.php5
-rw-r--r--lib/public/Config/BeforePreferenceSetEvent.php5
-rw-r--r--lib/public/Config/Exceptions/IncorrectTypeException.php5
-rw-r--r--lib/public/Config/Exceptions/TypeConflictException.php5
-rw-r--r--lib/public/Config/Exceptions/UnknownKeyException.php5
-rw-r--r--lib/public/Config/IUserConfig.php2
-rw-r--r--lib/public/Config/Lexicon/Entry.php23
-rw-r--r--lib/public/Config/Lexicon/ILexicon.php4
-rw-r--r--lib/public/Config/Lexicon/Preset.php5
-rw-r--r--lib/public/Config/Lexicon/Strictness.php5
-rw-r--r--lib/public/Config/ValueType.php4
-rw-r--r--lib/public/Federation/ICloudIdManager.php27
-rw-r--r--lib/public/Federation/ICloudIdResolver.php40
-rw-r--r--lib/public/IAppConfig.php28
-rw-r--r--lib/public/Share/IShare.php14
-rw-r--r--lib/public/Share/IShareProvider.php8
48 files changed, 669 insertions, 237 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 65c1a299dec..3f2dbe5edf9 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -376,6 +376,7 @@ return array(
'OCP\\Federation\\ICloudFederationShare' => $baseDir . '/lib/public/Federation/ICloudFederationShare.php',
'OCP\\Federation\\ICloudId' => $baseDir . '/lib/public/Federation/ICloudId.php',
'OCP\\Federation\\ICloudIdManager' => $baseDir . '/lib/public/Federation/ICloudIdManager.php',
+ 'OCP\\Federation\\ICloudIdResolver' => $baseDir . '/lib/public/Federation/ICloudIdResolver.php',
'OCP\\Files' => $baseDir . '/lib/public/Files.php',
'OCP\\FilesMetadata\\AMetadataEvent' => $baseDir . '/lib/public/FilesMetadata/AMetadataEvent.php',
'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => $baseDir . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php',
@@ -1217,7 +1218,6 @@ return array(
'OC\\Comments\\ManagerFactory' => $baseDir . '/lib/private/Comments/ManagerFactory.php',
'OC\\Config' => $baseDir . '/lib/private/Config.php',
'OC\\Config\\ConfigManager' => $baseDir . '/lib/private/Config/ConfigManager.php',
- 'OC\\Config\\Lexicon\\CoreConfigLexicon' => $baseDir . '/lib/private/Config/Lexicon/CoreConfigLexicon.php',
'OC\\Config\\UserConfig' => $baseDir . '/lib/private/Config/UserConfig.php',
'OC\\Console\\Application' => $baseDir . '/lib/private/Console/Application.php',
'OC\\Console\\TimestampFormatter' => $baseDir . '/lib/private/Console/TimestampFormatter.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 909ac3599f5..233b667add9 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -417,6 +417,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Federation\\ICloudFederationShare' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationShare.php',
'OCP\\Federation\\ICloudId' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudId.php',
'OCP\\Federation\\ICloudIdManager' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudIdManager.php',
+ 'OCP\\Federation\\ICloudIdResolver' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudIdResolver.php',
'OCP\\Files' => __DIR__ . '/../../..' . '/lib/public/Files.php',
'OCP\\FilesMetadata\\AMetadataEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/AMetadataEvent.php',
'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php',
@@ -1258,7 +1259,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Comments\\ManagerFactory' => __DIR__ . '/../../..' . '/lib/private/Comments/ManagerFactory.php',
'OC\\Config' => __DIR__ . '/../../..' . '/lib/private/Config.php',
'OC\\Config\\ConfigManager' => __DIR__ . '/../../..' . '/lib/private/Config/ConfigManager.php',
- 'OC\\Config\\Lexicon\\CoreConfigLexicon' => __DIR__ . '/../../..' . '/lib/private/Config/Lexicon/CoreConfigLexicon.php',
'OC\\Config\\UserConfig' => __DIR__ . '/../../..' . '/lib/private/Config/UserConfig.php',
'OC\\Console\\Application' => __DIR__ . '/../../..' . '/lib/private/Console/Application.php',
'OC\\Console\\TimestampFormatter' => __DIR__ . '/../../..' . '/lib/private/Console/TimestampFormatter.php',
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 6b8663e2ce5..9c7ea8f5f41 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -323,12 +323,24 @@ OC.L10N.register(
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
+ "Analyze images" : "Analizar imágenes",
+ "Ask a question about the given images." : "Haga una pregunta acerca de las imágenes proporcionadas.",
"Images" : "Imágenes",
+ "Images to ask a question about" : "Imágenes sobre las cuales se formulará una pregunta",
"Question" : "Pregunta",
"Generated response" : "Respuesta generada",
+ "The answer to the question" : "La respuesta a la pregunta",
+ "Voice chat with the assistant" : "Chat de voz con el asistente",
"System prompt" : "Prompt del sistema",
"Define rules and assumptions that the assistant should follow during the conversation." : "Definir las reglas y supuestos que el asistente debe seguir durante la conversación.",
+ "Chat voice message" : "Mensaje de voz del chat",
"Chat history" : "Historial de la conversación",
+ "Input transcript" : "Transcripción de entrada",
+ "Transcription of the audio input" : "Transcripción de la entrada de audio",
+ "Response voice message" : "Mensaje de voz de respuesta",
+ "The generated voice response as part of the conversation" : "La respuesta de voz generada como parte de la conversación",
+ "Output transcript" : "Transcripción de salida",
+ "Transcription of the audio output" : "Transcripción de la salida de audio",
"Transcribe audio" : "Transcribir audio",
"Transcribe the things said in an audio" : "Transcribir las cosas que se dicen en un audio",
"Audio input" : "Entrada de audio",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 997885dd7e1..29ee23631f9 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -321,12 +321,24 @@
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.",
+ "Analyze images" : "Analizar imágenes",
+ "Ask a question about the given images." : "Haga una pregunta acerca de las imágenes proporcionadas.",
"Images" : "Imágenes",
+ "Images to ask a question about" : "Imágenes sobre las cuales se formulará una pregunta",
"Question" : "Pregunta",
"Generated response" : "Respuesta generada",
+ "The answer to the question" : "La respuesta a la pregunta",
+ "Voice chat with the assistant" : "Chat de voz con el asistente",
"System prompt" : "Prompt del sistema",
"Define rules and assumptions that the assistant should follow during the conversation." : "Definir las reglas y supuestos que el asistente debe seguir durante la conversación.",
+ "Chat voice message" : "Mensaje de voz del chat",
"Chat history" : "Historial de la conversación",
+ "Input transcript" : "Transcripción de entrada",
+ "Transcription of the audio input" : "Transcripción de la entrada de audio",
+ "Response voice message" : "Mensaje de voz de respuesta",
+ "The generated voice response as part of the conversation" : "La respuesta de voz generada como parte de la conversación",
+ "Output transcript" : "Transcripción de salida",
+ "Transcription of the audio output" : "Transcripción de la salida de audio",
"Transcribe audio" : "Transcribir audio",
"Transcribe the things said in an audio" : "Transcribir las cosas que se dicen en un audio",
"Audio input" : "Entrada de audio",
diff --git a/lib/l10n/es_CL.js b/lib/l10n/es_CL.js
index b9ab4daa8d3..22ae429cf8c 100644
--- a/lib/l10n/es_CL.js
+++ b/lib/l10n/es_CL.js
@@ -74,6 +74,7 @@ OC.L10N.register(
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "El backend %s que comparte debe implementar la interface OCP\\Share_Backend",
"Sharing backend %s not found" : "No fue encontrado el Backend que comparte %s ",
"Sharing backend for %s not found" : "No fue encontrado el Backend que comparte para %s",
+ "Open %s" : "Abrir %s",
"Unknown share type" : "Tipo de elemento compartido desconocido",
"You are not allowed to share %s" : "No tienes permitido compartir %s",
"Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
diff --git a/lib/l10n/es_CL.json b/lib/l10n/es_CL.json
index 1bb3d70393a..75ed65fb736 100644
--- a/lib/l10n/es_CL.json
+++ b/lib/l10n/es_CL.json
@@ -72,6 +72,7 @@
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "El backend %s que comparte debe implementar la interface OCP\\Share_Backend",
"Sharing backend %s not found" : "No fue encontrado el Backend que comparte %s ",
"Sharing backend for %s not found" : "No fue encontrado el Backend que comparte para %s",
+ "Open %s" : "Abrir %s",
"Unknown share type" : "Tipo de elemento compartido desconocido",
"You are not allowed to share %s" : "No tienes permitido compartir %s",
"Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 1b86c9138c7..92080235dd5 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -30,14 +30,14 @@ OC.L10N.register(
"%sbit or higher PHP required." : "Vajalik on %s-bitine või parem PHP versioon.",
"The following architectures are supported: %s" : "Toetatud on järgnevad arhitektuurid: %s",
"The following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
- "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
- "The library %s is not available." : "Teek %s pole saadaval.",
+ "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leidu",
+ "The library %s is not available." : " %s teek pole saadaval.",
"Library %1$s with a version higher than %2$s is required - available version %3$s." : "Vajalik on „%1$s“ teek suurema versiooniga kui %2$s - hetkel on versioon %3$s.",
"Library %1$s with a version lower than %2$s is required - available version %3$s." : "Vajalik on „%1$s“ teek väiksema versiooniga kui %2$s - hetkel on versioon %3$s.",
"The following platforms are supported: %s" : "Toetatud on järgmised platvormid: %s",
"Server version %s or higher is required." : "Nõutav on serveri versioon %s või suurem.",
"Server version %s or lower is required." : "Serveri versioon %s või madalam on nõutav.",
- "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige või omama eraldi õiguse selle seadustuse muutmiseks",
+ "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige või omama eraldi õigust selle seadustuse muutmiseks",
"Your current IP address doesn't allow you to perform admin actions" : "Sinu praeguselt e-posti aadressilt ei saa teha haldustoiminguid",
"Logged in account must be an admin or sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige",
"Logged in account must be an admin" : "Sisselogitud kasutajakonto peab olema peakasutajate grupi liige",
@@ -160,6 +160,7 @@ OC.L10N.register(
"PostgreSQL Login and/or password not valid" : "PostgreSQLi andmebaasi kasutajatunnus ja/või salasõna pole õiged",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk!" : "Mac OS X ei ole toetatud ja %s ei pruugi korralikult toimida sellel platvormil. Kasuta seda omal vastutusel!",
"For the best results, please consider using a GNU/Linux server instead." : "Parema tulemuse saavitamiseks palun kaalu serveris GNU/Linux kasutamist.",
+ "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." : "Tundub, et %s server töötab 32-bitises PHP käituskeskkonnas ja „open_basedir“ on php.ini failis seadistatud. Kui failide suurus on üle 4 GB, siis võib tekkida probleeme ning antud lahenduse kasutamist me ei soovita.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Palun eemalda oma serveri seadistustest php.ini failist „open_basedir“ seadistus või võta kasutusele 64-bitisel platvormil põhinev PHP versioon.",
"Set an admin Login." : "Lisa peakasutaja kasutajanimi.",
"Set an admin password." : "Lisa peakasutaja salasõna.",
@@ -214,6 +215,7 @@ OC.L10N.register(
"Group \"%s\" does not exist" : "„%s“ gruppi pole olemas",
"The requested share does not exist anymore" : "Soovitud jagamist enam ei eksisteeri",
"The requested share comes from a disabled user" : "Soovitud jaosmeedia on loonud blokeeritud kasutaja",
+ "The user was not created because the user limit has been reached. Check your notifications to learn more." : "Kuna kasutajate arvu ülempiir on käes, siis uus kasutaja jäi lisamata. Lisateavet leiad oma teavitustest.",
"Could not find category \"%s\"" : "Ei leia kategooriat „%s“",
"Input text" : "Sisendtekst",
"The input text" : "Sisendtekst",
@@ -386,6 +388,8 @@ OC.L10N.register(
"Output speech" : "Kõneväljund",
"The generated speech" : "Koostatud kõne",
"Describe a task that you want the assistant to do or ask a question" : "Kirjelda seda, mida soovid Abilisele ülesandeks teha või lihtsalt küsi midagi.",
+ "Generated reply" : "Koostatud vastus",
+ "The generated text from the assistant" : "Abilise poolt koostatud tekst",
"Change Tone" : "Teksti tooni muutmine",
"Change the tone of a piece of text." : "Muuda antud teksti tonaalsust.",
"Write a text that you want the assistant to rewrite in another tone." : "Kirjuta üles see, mille tonaalsust tahad Abilisel lasta ümber kirjutada.",
@@ -399,6 +403,9 @@ OC.L10N.register(
"The generated response as part of the conversation" : "Loodud vastus vestluse osana",
"Formalize text" : "Muuda tekst ametlikuks",
"Takes a text and makes it sound more formal" : "Sisestatud teksti vormistamine ametlikuna",
+ "Write a text that you want the assistant to formalize" : "Sisesta tekst, mille Abiline peaks tegema ametlikumaks",
+ "Formalized text" : "Ametlikus vormis tekst",
+ "The formalized text" : "Mitteametlikus vormis tekst",
"Generate a headline" : "Alapealkirja loomine",
"Generates a possible headline for a text." : "Võimaldab luua teksti põhjal kokkuvõtliku alapealkirja.",
"Original text" : "Lähtetekst",
@@ -410,7 +417,26 @@ OC.L10N.register(
"The text to proofread" : "Keelekorrektuuri vajav tekst",
"Corrections" : "Korrektuuris tehtud parandused",
"The corrections that should be made in your text" : "Korrektuuris tehtud parandused, mis peaks sinu teksti lisanduma",
+ "Reformulate text" : "Teksti sõnastuse mutmine",
+ "Takes a text and reformulates it" : "Sisendina antud tekst saab ümbersõnastatud",
+ "Write a text that you want the assistant to reformulate" : "Sisesta tekst, mille Abiline peaks ümbersõnastama",
+ "Reformulated text" : "Ümbersõnastatud tekst",
+ "The reformulated text, written by the assistant" : "Abilise poolt ümbersõnastatud tekst",
+ "Simplify text" : "Teksti lihtsustamine",
+ "Takes a text and simplifies it" : "Sisendina antud tekst saab lihtsustatud",
+ "Write a text that you want the assistant to simplify" : "Sisesta tekst, mille Abiline peaks tegema lihtsamaks",
+ "Simplified text" : "Lihtsustatud tekst",
+ "The simplified text" : "Lihtsustatud tekst",
+ "Summarize" : "Teksti kokkuvõte",
+ "Summarizes a text" : "Sisendina antud tekstist tehakse kokkuvõte",
+ "The original text to summarize" : "Algme tekst, millest peaks tegema kokkuvõtte",
"Summary" : "Kokkuvõte",
+ "The generated summary" : "Koostatud kokkuvõte",
+ "Extract topics" : "Teemade esiletoomine",
+ "Extracts topics from a text and outputs them separated by commas" : "Sisendina antud tekstist leitakse teemad, mis väljastatakse komadega eraldatud loendina",
+ "The original text to extract topics from" : "Lähtetekst, millest teemad tuvastatakse",
+ "Topics" : "Teemad",
+ "The list of extracted topics" : "Tuvastatud teemade loend",
"Translate" : "Tõlgi",
"Translate text from one language to another" : "Tõlgi teksti ühest keelest teise",
"Origin text" : "Lähtetekst",
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index d0d0451b338..b8e16d36993 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -28,14 +28,14 @@
"%sbit or higher PHP required." : "Vajalik on %s-bitine või parem PHP versioon.",
"The following architectures are supported: %s" : "Toetatud on järgnevad arhitektuurid: %s",
"The following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
- "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
- "The library %s is not available." : "Teek %s pole saadaval.",
+ "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leidu",
+ "The library %s is not available." : " %s teek pole saadaval.",
"Library %1$s with a version higher than %2$s is required - available version %3$s." : "Vajalik on „%1$s“ teek suurema versiooniga kui %2$s - hetkel on versioon %3$s.",
"Library %1$s with a version lower than %2$s is required - available version %3$s." : "Vajalik on „%1$s“ teek väiksema versiooniga kui %2$s - hetkel on versioon %3$s.",
"The following platforms are supported: %s" : "Toetatud on järgmised platvormid: %s",
"Server version %s or higher is required." : "Nõutav on serveri versioon %s või suurem.",
"Server version %s or lower is required." : "Serveri versioon %s või madalam on nõutav.",
- "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige või omama eraldi õiguse selle seadustuse muutmiseks",
+ "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige või omama eraldi õigust selle seadustuse muutmiseks",
"Your current IP address doesn't allow you to perform admin actions" : "Sinu praeguselt e-posti aadressilt ei saa teha haldustoiminguid",
"Logged in account must be an admin or sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate või selle alamgrupi liige",
"Logged in account must be an admin" : "Sisselogitud kasutajakonto peab olema peakasutajate grupi liige",
@@ -158,6 +158,7 @@
"PostgreSQL Login and/or password not valid" : "PostgreSQLi andmebaasi kasutajatunnus ja/või salasõna pole õiged",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk!" : "Mac OS X ei ole toetatud ja %s ei pruugi korralikult toimida sellel platvormil. Kasuta seda omal vastutusel!",
"For the best results, please consider using a GNU/Linux server instead." : "Parema tulemuse saavitamiseks palun kaalu serveris GNU/Linux kasutamist.",
+ "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." : "Tundub, et %s server töötab 32-bitises PHP käituskeskkonnas ja „open_basedir“ on php.ini failis seadistatud. Kui failide suurus on üle 4 GB, siis võib tekkida probleeme ning antud lahenduse kasutamist me ei soovita.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Palun eemalda oma serveri seadistustest php.ini failist „open_basedir“ seadistus või võta kasutusele 64-bitisel platvormil põhinev PHP versioon.",
"Set an admin Login." : "Lisa peakasutaja kasutajanimi.",
"Set an admin password." : "Lisa peakasutaja salasõna.",
@@ -212,6 +213,7 @@
"Group \"%s\" does not exist" : "„%s“ gruppi pole olemas",
"The requested share does not exist anymore" : "Soovitud jagamist enam ei eksisteeri",
"The requested share comes from a disabled user" : "Soovitud jaosmeedia on loonud blokeeritud kasutaja",
+ "The user was not created because the user limit has been reached. Check your notifications to learn more." : "Kuna kasutajate arvu ülempiir on käes, siis uus kasutaja jäi lisamata. Lisateavet leiad oma teavitustest.",
"Could not find category \"%s\"" : "Ei leia kategooriat „%s“",
"Input text" : "Sisendtekst",
"The input text" : "Sisendtekst",
@@ -384,6 +386,8 @@
"Output speech" : "Kõneväljund",
"The generated speech" : "Koostatud kõne",
"Describe a task that you want the assistant to do or ask a question" : "Kirjelda seda, mida soovid Abilisele ülesandeks teha või lihtsalt küsi midagi.",
+ "Generated reply" : "Koostatud vastus",
+ "The generated text from the assistant" : "Abilise poolt koostatud tekst",
"Change Tone" : "Teksti tooni muutmine",
"Change the tone of a piece of text." : "Muuda antud teksti tonaalsust.",
"Write a text that you want the assistant to rewrite in another tone." : "Kirjuta üles see, mille tonaalsust tahad Abilisel lasta ümber kirjutada.",
@@ -397,6 +401,9 @@
"The generated response as part of the conversation" : "Loodud vastus vestluse osana",
"Formalize text" : "Muuda tekst ametlikuks",
"Takes a text and makes it sound more formal" : "Sisestatud teksti vormistamine ametlikuna",
+ "Write a text that you want the assistant to formalize" : "Sisesta tekst, mille Abiline peaks tegema ametlikumaks",
+ "Formalized text" : "Ametlikus vormis tekst",
+ "The formalized text" : "Mitteametlikus vormis tekst",
"Generate a headline" : "Alapealkirja loomine",
"Generates a possible headline for a text." : "Võimaldab luua teksti põhjal kokkuvõtliku alapealkirja.",
"Original text" : "Lähtetekst",
@@ -408,7 +415,26 @@
"The text to proofread" : "Keelekorrektuuri vajav tekst",
"Corrections" : "Korrektuuris tehtud parandused",
"The corrections that should be made in your text" : "Korrektuuris tehtud parandused, mis peaks sinu teksti lisanduma",
+ "Reformulate text" : "Teksti sõnastuse mutmine",
+ "Takes a text and reformulates it" : "Sisendina antud tekst saab ümbersõnastatud",
+ "Write a text that you want the assistant to reformulate" : "Sisesta tekst, mille Abiline peaks ümbersõnastama",
+ "Reformulated text" : "Ümbersõnastatud tekst",
+ "The reformulated text, written by the assistant" : "Abilise poolt ümbersõnastatud tekst",
+ "Simplify text" : "Teksti lihtsustamine",
+ "Takes a text and simplifies it" : "Sisendina antud tekst saab lihtsustatud",
+ "Write a text that you want the assistant to simplify" : "Sisesta tekst, mille Abiline peaks tegema lihtsamaks",
+ "Simplified text" : "Lihtsustatud tekst",
+ "The simplified text" : "Lihtsustatud tekst",
+ "Summarize" : "Teksti kokkuvõte",
+ "Summarizes a text" : "Sisendina antud tekstist tehakse kokkuvõte",
+ "The original text to summarize" : "Algme tekst, millest peaks tegema kokkuvõtte",
"Summary" : "Kokkuvõte",
+ "The generated summary" : "Koostatud kokkuvõte",
+ "Extract topics" : "Teemade esiletoomine",
+ "Extracts topics from a text and outputs them separated by commas" : "Sisendina antud tekstist leitakse teemad, mis väljastatakse komadega eraldatud loendina",
+ "The original text to extract topics from" : "Lähtetekst, millest teemad tuvastatakse",
+ "Topics" : "Teemad",
+ "The list of extracted topics" : "Tuvastatud teemade loend",
"Translate" : "Tõlgi",
"Translate text from one language to another" : "Tõlgi teksti ühest keelest teise",
"Origin text" : "Lähtetekst",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index b6de0091936..edfe25a6362 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -324,13 +324,14 @@ OC.L10N.register(
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
+ "Analyze images" : "Analyser des images",
"Images" : "Images",
"Question" : "Question",
"Generated response" : "Réponse générée",
"System prompt" : "Invite du système",
"Define rules and assumptions that the assistant should follow during the conversation." : "Définir les règles et les hypothèses que l'assistant doit suivre pendant la conversation.",
"Chat history" : "Historique de la discussion",
- "Transcribe audio" : "Transcrire l'audio",
+ "Transcribe audio" : "Transcrire de l'audio",
"Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio",
"Audio input" : "Entrée audio",
"The audio to transcribe" : "Audio à retranscrire",
@@ -348,7 +349,7 @@ OC.L10N.register(
"Chat message" : "Message de discussion",
"A chat message to send to the agent." : "Un message instantané à envoyer à l'agent.",
"The response from the chat model." : "La réponse du modèle de messagerie instantanée",
- "Context write" : "Écrire contextuellement",
+ "Context write" : "Écrire selon un contexte",
"Writes text in a given style based on the provided source material." : "Écrit un texte dans un style donné, basé sur des données initiales préalablement fournies.",
"Writing style" : "Style rédactionnel",
"Demonstrate a writing style that you would like to immitate" : "Montrez un style d'écriture que vous aimeriez imiter",
@@ -356,12 +357,12 @@ OC.L10N.register(
"The content that would like to be rewritten in the new writing style" : "Contenu qui doit être réécrit dans le nouveau style de rédaction",
"Generated text" : "Texte généré",
"The generated text with content from the source material in the given style" : "Le texte généré reprend le contenu du document source dans le style donné",
- "Emoji generator" : "Générateur d'emoji",
+ "Emoji generator" : "Générateur d'émoji",
"Takes text and generates a representative emoji for it." : "Prend un texte et génère un émoji représentatif.",
"The text to generate an emoji for" : "Texte pour lequel générer un émoji",
"Generated emoji" : "Émoji généré",
"The generated emoji based on the input text" : "Émoji généré en fonction du texte saisi",
- "Generate image" : "Générer l'image",
+ "Generate image" : "Générer une image",
"Generate an image from a text prompt" : "Générer une image à partir d'un texte",
"Prompt" : "Prompt",
"Describe the image you want to generate" : "Décrivez l'image que vous souhaitez générer",
@@ -369,7 +370,7 @@ OC.L10N.register(
"How many images to generate" : "Nombre d'images à générer",
"Output images" : "Images de sortie",
"The generated images" : "Les images générées",
- "Generate speech" : "Générer la vocalisation",
+ "Generate speech" : "Générer une synthèse vocale",
"Generate speech from a transcript" : "Générer la vocalisation à partir d'une transcription",
"Write transcript that you want the assistant to generate speech from" : "Écrire la transcription à partir de laquelle vous voulez générer la vocalisation",
"Output speech" : "Sortie de la vocalisation",
@@ -430,7 +431,7 @@ OC.L10N.register(
"The original text to summarize" : "Le texte original à résumer",
"Summary" : "Résumé",
"The generated summary" : "Le résumé généré",
- "Extract topics" : "Extraire des thèmes",
+ "Extract topics" : "Extraire des sujets",
"Extracts topics from a text and outputs them separated by commas" : "Extrait les sujets d'un texte et les affiche en les séparant par des virgules.",
"The original text to extract topics from" : "Texte original à partir duquel les thèmes sont extraits",
"Topics" : "Sujets",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index 3776b605f33..6f1edd70da2 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -322,13 +322,14 @@
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.",
+ "Analyze images" : "Analyser des images",
"Images" : "Images",
"Question" : "Question",
"Generated response" : "Réponse générée",
"System prompt" : "Invite du système",
"Define rules and assumptions that the assistant should follow during the conversation." : "Définir les règles et les hypothèses que l'assistant doit suivre pendant la conversation.",
"Chat history" : "Historique de la discussion",
- "Transcribe audio" : "Transcrire l'audio",
+ "Transcribe audio" : "Transcrire de l'audio",
"Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio",
"Audio input" : "Entrée audio",
"The audio to transcribe" : "Audio à retranscrire",
@@ -346,7 +347,7 @@
"Chat message" : "Message de discussion",
"A chat message to send to the agent." : "Un message instantané à envoyer à l'agent.",
"The response from the chat model." : "La réponse du modèle de messagerie instantanée",
- "Context write" : "Écrire contextuellement",
+ "Context write" : "Écrire selon un contexte",
"Writes text in a given style based on the provided source material." : "Écrit un texte dans un style donné, basé sur des données initiales préalablement fournies.",
"Writing style" : "Style rédactionnel",
"Demonstrate a writing style that you would like to immitate" : "Montrez un style d'écriture que vous aimeriez imiter",
@@ -354,12 +355,12 @@
"The content that would like to be rewritten in the new writing style" : "Contenu qui doit être réécrit dans le nouveau style de rédaction",
"Generated text" : "Texte généré",
"The generated text with content from the source material in the given style" : "Le texte généré reprend le contenu du document source dans le style donné",
- "Emoji generator" : "Générateur d'emoji",
+ "Emoji generator" : "Générateur d'émoji",
"Takes text and generates a representative emoji for it." : "Prend un texte et génère un émoji représentatif.",
"The text to generate an emoji for" : "Texte pour lequel générer un émoji",
"Generated emoji" : "Émoji généré",
"The generated emoji based on the input text" : "Émoji généré en fonction du texte saisi",
- "Generate image" : "Générer l'image",
+ "Generate image" : "Générer une image",
"Generate an image from a text prompt" : "Générer une image à partir d'un texte",
"Prompt" : "Prompt",
"Describe the image you want to generate" : "Décrivez l'image que vous souhaitez générer",
@@ -367,7 +368,7 @@
"How many images to generate" : "Nombre d'images à générer",
"Output images" : "Images de sortie",
"The generated images" : "Les images générées",
- "Generate speech" : "Générer la vocalisation",
+ "Generate speech" : "Générer une synthèse vocale",
"Generate speech from a transcript" : "Générer la vocalisation à partir d'une transcription",
"Write transcript that you want the assistant to generate speech from" : "Écrire la transcription à partir de laquelle vous voulez générer la vocalisation",
"Output speech" : "Sortie de la vocalisation",
@@ -428,7 +429,7 @@
"The original text to summarize" : "Le texte original à résumer",
"Summary" : "Résumé",
"The generated summary" : "Le résumé généré",
- "Extract topics" : "Extraire des thèmes",
+ "Extract topics" : "Extraire des sujets",
"Extracts topics from a text and outputs them separated by commas" : "Extrait les sujets d'un texte et les affiche en les séparant par des virgules.",
"The original text to extract topics from" : "Texte original à partir duquel les thèmes sont extraits",
"Topics" : "Sujets",
diff --git a/lib/l10n/sw.js b/lib/l10n/sw.js
index adc3bc63473..9e10b43b403 100644
--- a/lib/l10n/sw.js
+++ b/lib/l10n/sw.js
@@ -8,12 +8,15 @@ OC.L10N.register(
"View profile" : "Angalia wasifu",
"Local time: %s" : "Muda wa kawaida: %s",
"_%n year ago_::_%n years ago_" : ["%n year ago","%n years ago"],
+ "_%n hour ago_::_%n hours ago_" : ["%n hour ago","%n hours ago"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minute ago","%n minutes ago"],
"seconds ago" : "sukunde zilizopita",
"%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
"renamed file" : "Faili iliyopewa jina jipya",
"Filenames must not end with \"%1$s\"." : "Majina ya faili hayapaswi kuishia na \"%1$s\"",
"File already exists" : "Faili lipo tayari",
"Templates" : "Violezo",
+ "Filename contains at least one invalid character" : "Filename contains at least one invalid character",
"__language_name__" : "_lugha_jina_",
"Apps" : "Maombi",
"Settings" : "Mipangilio",
diff --git a/lib/l10n/sw.json b/lib/l10n/sw.json
index c576f37cabc..a645af4e6a8 100644
--- a/lib/l10n/sw.json
+++ b/lib/l10n/sw.json
@@ -6,12 +6,15 @@
"View profile" : "Angalia wasifu",
"Local time: %s" : "Muda wa kawaida: %s",
"_%n year ago_::_%n years ago_" : ["%n year ago","%n years ago"],
+ "_%n hour ago_::_%n hours ago_" : ["%n hour ago","%n hours ago"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minute ago","%n minutes ago"],
"seconds ago" : "sukunde zilizopita",
"%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
"renamed file" : "Faili iliyopewa jina jipya",
"Filenames must not end with \"%1$s\"." : "Majina ya faili hayapaswi kuishia na \"%1$s\"",
"File already exists" : "Faili lipo tayari",
"Templates" : "Violezo",
+ "Filename contains at least one invalid character" : "Filename contains at least one invalid character",
"__language_name__" : "_lugha_jina_",
"Apps" : "Maombi",
"Settings" : "Mipangilio",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 4b07dd98f4b..4e871b4130f 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -324,33 +324,145 @@ OC.L10N.register(
"Storage is temporarily not available" : "Сховище тимчасово недоступне",
"Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Щоби дозволити запуск цієї перевірки, потрібно пересвідчитися, що ваш вебсервер може з'єднуватися з самим собою, що передбачає можливість резолвити та з'єднуватися з одним з `trusted_domains` або `overwrite.cli.url`. Неможливість цього може бути результатом незбігу DNS на стороні сервера або встановленими правилами брандмауера.",
+ "Analyze images" : "Аналізуйте зображення",
+ "Ask a question about the given images." : "Поставте запитання про наведені зображення.",
"Images" : "Зображення",
+ "Images to ask a question about" : "Зображення, про які можна задати питання",
"Question" : "Питання",
+ "What to ask about the images." : "Що запитати про зображення.",
+ "Generated response" : "Згенерована відповідь",
+ "The answer to the question" : "Відповідь на питання",
+ "Audio chat" : "Аудіо чат",
+ "Voice chat with the assistant" : "Голосовий чат з асистентом",
"System prompt" : "Системний запит",
+ "Define rules and assumptions that the assistant should follow during the conversation." : "Визначте правила та припущення, яких асистент повинен дотримуватися під час розмови.",
+ "Chat voice message" : "Голосове повідомлення в чаті",
+ "Describe a task that you want the assistant to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання.",
"Chat history" : "Історія чату",
+ "The history of chat messages before the current message, starting with a message by the user." : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача.",
+ "Input transcript" : "Вхідна стенограма",
+ "Transcription of the audio input" : "Транскрипція аудіовходу",
+ "Response voice message" : "Голосове повідомлення у відповідь",
+ "The generated voice response as part of the conversation" : "Згенерована голосова відповідь як частина розмови",
+ "Output transcript" : "Вихідна розшифровка",
+ "Transcription of the audio output" : "Транскрипція аудіовиходу",
"Transcribe audio" : "Транскрибувати аудіо",
"Transcribe the things said in an audio" : "Транскрибувати голос",
"Audio input" : "Аудіовхід",
"The audio to transcribe" : "Аудіо для транскрибування",
+ "Transcription" : "Транскрипція",
"The transcribed text" : "Транскрибований текст",
+ "Chat by voice with an agent" : "Голосовий чат з агентом",
+ "Describe a task that you want the agent to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб агент виконав, або поставте запитання.",
"Confirmation" : "Підтвердження",
+ "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Чи підтверджувати раніше запитані дії: 0 для відмови та 1 для підтвердження.",
+ "Conversation token" : "Токен розмови",
+ "A token representing the conversation." : "Токен, що представляє розмову.",
+ "The new conversation token" : "Новий токен розмови",
+ "Send this along with the next interaction." : "Надішліть це разом з наступною взаємодією.",
+ "Requested actions by the agent" : "Необхідні дії агента",
+ "Actions that the agent would like to carry out in JSON format." : "Дії, які агент хотів би виконати у форматі JSON.",
+ "Chat with an agent" : "Чат з агентом",
+ "Chat message" : "Повідомлення в чаті",
+ "A chat message to send to the agent." : "Повідомлення в чаті для відправки агенту.",
+ "The response from the chat model." : "Відповідь від чат-моделі.",
+ "Context write" : "Контекстний запис",
+ "Writes text in a given style based on the provided source material." : "Пише текст у заданому стилі на основі наданого вихідного матеріалу.",
"Writing style" : "Стиль письма",
+ "Demonstrate a writing style that you would like to immitate" : "Продемонструйте стиль письма, який ви хотіли б наслідувати",
+ "Source material" : "Вихідний матеріал",
+ "The content that would like to be rewritten in the new writing style" : "Контент, який хотілося б переписати в новому стилі",
"Generated text" : "Зґенерований текст",
+ "The generated text with content from the source material in the given style" : "Згенерований текст з вмістом з вихідного матеріалу в заданому стилі",
"Emoji generator" : "Ґенератор емоційок",
+ "Takes text and generates a representative emoji for it." : "Бере текст і генерує для нього відповідний емодзі.",
+ "The text to generate an emoji for" : "Текст для створення емодзі для",
"Generated emoji" : "Зґенеровані емоційки",
+ "The generated emoji based on the input text" : "Згенеровані емодзі на основі введеного тексту",
"Generate image" : "Зґенерувати зображення",
+ "Generate an image from a text prompt" : "Створити зображення з текстової підказки",
"Prompt" : "Запрошення",
+ "Describe the image you want to generate" : "Опишіть зображення, яке ви хочете створити",
+ "Number of images" : "Кількість зображень",
+ "How many images to generate" : "Скільки зображень генерувати",
+ "Output images" : "Вихідні зображення",
+ "The generated images" : "Згенеровані зображення",
+ "Generate speech" : "Генерування мовлення",
+ "Generate speech from a transcript" : "Створюйте мовлення з транскрипту",
+ "Write transcript that you want the assistant to generate speech from" : "Напишіть стенограму, з якої ви хочете, щоб асистент генерував мовлення",
+ "Output speech" : "Вихідне мовлення",
+ "The generated speech" : "Згенероване мовлення",
+ "Free text to text prompt" : "Безкоштовна підказка з тексту на текст",
+ "Runs an arbitrary prompt through a language model that returns a reply" : "Запускає довільний запит через мовну модель, яка повертає відповідь",
+ "Describe a task that you want the assistant to do or ask a question" : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання",
+ "Generated reply" : "Згенерована відповідь",
+ "The generated text from the assistant" : "Згенерований текст від помічника",
+ "Change Tone" : "Змінити тон",
+ "Change the tone of a piece of text." : "Змініть тон фрагмента тексту.",
+ "Write a text that you want the assistant to rewrite in another tone." : "Напишіть текст, який ви хочете, щоб асистент переписав в іншій тональності.",
+ "Desired tone" : "Бажаний тон",
+ "In which tone should your text be rewritten?" : "В якій тональності переписувати текст?",
+ "The rewritten text in the desired tone, written by the assistant:" : "Переписаний текст у потрібній тональності, написаний асистентом:",
"Chat" : "Чат",
+ "Chat with the assistant" : "Чат з асистентом",
+ "The history of chat messages before the current message, starting with a message by the user" : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача",
"Response message" : "Відповідь",
+ "The generated response as part of the conversation" : "Згенерована відповідь як частина розмови",
+ "Chat with tools" : "Чат з інструментами",
+ "Chat with the language model with tool calling support." : "Чат з мовною моделлю з підтримкою виклику інструментів.",
+ "Tool message" : "Повідомлення про інструмент",
+ "The result of tool calls in the last interaction" : "Результат викликів інструментів в останній взаємодії",
"Available tools" : "Доступні інструменти",
+ "The available tools in JSON format" : "Доступні інструменти у форматі JSON",
+ "The response from the chat model" : "Відповідь від чат-моделі",
+ "Tool calls" : "Виклики інструментів",
+ "Tools call instructions from the model in JSON format" : "Інструменти викликають інструкції з моделі у форматі JSON",
+ "Formalize text" : "Формалізуйте текст",
+ "Takes a text and makes it sound more formal" : "Бере текст і робить його більш формальним",
+ "Write a text that you want the assistant to formalize" : "Напишіть текст, який ви хочете, щоб асистент оформив",
+ "Formalized text" : "Формалізований текст",
+ "The formalized text" : "Формалізований текст",
+ "Generate a headline" : "Створіть заголовок",
"Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.",
+ "Original text" : "Оригінальний текст",
+ "The original text to generate a headline for" : "Вихідний текст для створення заголовка для",
+ "The generated headline" : "Згенерований заголовок",
+ "Proofread" : "Вичитано",
+ "Proofreads a text and lists corrections" : "Вичитує текст і складає список виправлень",
"Text" : "Текст",
+ "The text to proofread" : "Текст для вичитки",
+ "Corrections" : "Виправлення",
+ "The corrections that should be made in your text" : "Виправлення, які слід зробити у вашому тексті",
+ "Reformulate text" : "Переформатуйте текст",
+ "Takes a text and reformulates it" : "Бере текст і переформатовує його",
+ "Write a text that you want the assistant to reformulate" : "Напишіть текст, який ви хочете, щоб асистент переформулював",
+ "Reformulated text" : "Переформульований текст",
+ "The reformulated text, written by the assistant" : "Переформульований текст, написаний асистентом",
+ "Simplify text" : "Спростити текст",
+ "Takes a text and simplifies it" : "Бере текст і спрощує його",
+ "Write a text that you want the assistant to simplify" : "Напишіть текст, який ви хочете, щоб асистент спростив",
+ "Simplified text" : "Спрощений текст",
+ "The simplified text" : "Спрощений текст",
"Summarize" : "Підсумок",
+ "Summarizes a text" : "Підсумовує текст",
+ "The original text to summarize" : "Оригінальний текст для підбиття підсумків",
"Summary" : "Загалом",
+ "The generated summary" : "Згенерований підсумок",
"Extract topics" : "Виділити теми",
+ "Extracts topics from a text and outputs them separated by commas" : "Витягує теми з тексту і виводить їх через кому",
+ "The original text to extract topics from" : "Оригінальний текст, з якого можна взяти теми",
+ "Topics" : "Теми",
+ "The list of extracted topics" : "Список витягнутих тем",
"Translate" : "Перекласти",
+ "Translate text from one language to another" : "Перекладіть текст з однієї мови на іншу",
+ "Origin text" : "Вихідний текст",
+ "The text to translate" : "Текст для перекладу",
+ "Origin language" : "Мова походження",
+ "The language of the origin text" : "Мова оригінального тексту",
"Target language" : "Цільова мова",
+ "The desired language to translate the origin text in" : "Бажана мова для перекладу вихідного тексту",
"Result" : "Результат",
+ "The translated text" : "Перекладений текст",
"Free prompt" : "Вільне запрошення",
"Runs an arbitrary prompt through the language model." : "Виконує довільне запрошення через мовну модель.",
"Generate headline" : "Створити заголовок",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 0b7e6dbf87a..285c39ff532 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -322,33 +322,145 @@
"Storage is temporarily not available" : "Сховище тимчасово недоступне",
"Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %s",
"To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Щоби дозволити запуск цієї перевірки, потрібно пересвідчитися, що ваш вебсервер може з'єднуватися з самим собою, що передбачає можливість резолвити та з'єднуватися з одним з `trusted_domains` або `overwrite.cli.url`. Неможливість цього може бути результатом незбігу DNS на стороні сервера або встановленими правилами брандмауера.",
+ "Analyze images" : "Аналізуйте зображення",
+ "Ask a question about the given images." : "Поставте запитання про наведені зображення.",
"Images" : "Зображення",
+ "Images to ask a question about" : "Зображення, про які можна задати питання",
"Question" : "Питання",
+ "What to ask about the images." : "Що запитати про зображення.",
+ "Generated response" : "Згенерована відповідь",
+ "The answer to the question" : "Відповідь на питання",
+ "Audio chat" : "Аудіо чат",
+ "Voice chat with the assistant" : "Голосовий чат з асистентом",
"System prompt" : "Системний запит",
+ "Define rules and assumptions that the assistant should follow during the conversation." : "Визначте правила та припущення, яких асистент повинен дотримуватися під час розмови.",
+ "Chat voice message" : "Голосове повідомлення в чаті",
+ "Describe a task that you want the assistant to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання.",
"Chat history" : "Історія чату",
+ "The history of chat messages before the current message, starting with a message by the user." : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача.",
+ "Input transcript" : "Вхідна стенограма",
+ "Transcription of the audio input" : "Транскрипція аудіовходу",
+ "Response voice message" : "Голосове повідомлення у відповідь",
+ "The generated voice response as part of the conversation" : "Згенерована голосова відповідь як частина розмови",
+ "Output transcript" : "Вихідна розшифровка",
+ "Transcription of the audio output" : "Транскрипція аудіовиходу",
"Transcribe audio" : "Транскрибувати аудіо",
"Transcribe the things said in an audio" : "Транскрибувати голос",
"Audio input" : "Аудіовхід",
"The audio to transcribe" : "Аудіо для транскрибування",
+ "Transcription" : "Транскрипція",
"The transcribed text" : "Транскрибований текст",
+ "Chat by voice with an agent" : "Голосовий чат з агентом",
+ "Describe a task that you want the agent to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб агент виконав, або поставте запитання.",
"Confirmation" : "Підтвердження",
+ "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Чи підтверджувати раніше запитані дії: 0 для відмови та 1 для підтвердження.",
+ "Conversation token" : "Токен розмови",
+ "A token representing the conversation." : "Токен, що представляє розмову.",
+ "The new conversation token" : "Новий токен розмови",
+ "Send this along with the next interaction." : "Надішліть це разом з наступною взаємодією.",
+ "Requested actions by the agent" : "Необхідні дії агента",
+ "Actions that the agent would like to carry out in JSON format." : "Дії, які агент хотів би виконати у форматі JSON.",
+ "Chat with an agent" : "Чат з агентом",
+ "Chat message" : "Повідомлення в чаті",
+ "A chat message to send to the agent." : "Повідомлення в чаті для відправки агенту.",
+ "The response from the chat model." : "Відповідь від чат-моделі.",
+ "Context write" : "Контекстний запис",
+ "Writes text in a given style based on the provided source material." : "Пише текст у заданому стилі на основі наданого вихідного матеріалу.",
"Writing style" : "Стиль письма",
+ "Demonstrate a writing style that you would like to immitate" : "Продемонструйте стиль письма, який ви хотіли б наслідувати",
+ "Source material" : "Вихідний матеріал",
+ "The content that would like to be rewritten in the new writing style" : "Контент, який хотілося б переписати в новому стилі",
"Generated text" : "Зґенерований текст",
+ "The generated text with content from the source material in the given style" : "Згенерований текст з вмістом з вихідного матеріалу в заданому стилі",
"Emoji generator" : "Ґенератор емоційок",
+ "Takes text and generates a representative emoji for it." : "Бере текст і генерує для нього відповідний емодзі.",
+ "The text to generate an emoji for" : "Текст для створення емодзі для",
"Generated emoji" : "Зґенеровані емоційки",
+ "The generated emoji based on the input text" : "Згенеровані емодзі на основі введеного тексту",
"Generate image" : "Зґенерувати зображення",
+ "Generate an image from a text prompt" : "Створити зображення з текстової підказки",
"Prompt" : "Запрошення",
+ "Describe the image you want to generate" : "Опишіть зображення, яке ви хочете створити",
+ "Number of images" : "Кількість зображень",
+ "How many images to generate" : "Скільки зображень генерувати",
+ "Output images" : "Вихідні зображення",
+ "The generated images" : "Згенеровані зображення",
+ "Generate speech" : "Генерування мовлення",
+ "Generate speech from a transcript" : "Створюйте мовлення з транскрипту",
+ "Write transcript that you want the assistant to generate speech from" : "Напишіть стенограму, з якої ви хочете, щоб асистент генерував мовлення",
+ "Output speech" : "Вихідне мовлення",
+ "The generated speech" : "Згенероване мовлення",
+ "Free text to text prompt" : "Безкоштовна підказка з тексту на текст",
+ "Runs an arbitrary prompt through a language model that returns a reply" : "Запускає довільний запит через мовну модель, яка повертає відповідь",
+ "Describe a task that you want the assistant to do or ask a question" : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання",
+ "Generated reply" : "Згенерована відповідь",
+ "The generated text from the assistant" : "Згенерований текст від помічника",
+ "Change Tone" : "Змінити тон",
+ "Change the tone of a piece of text." : "Змініть тон фрагмента тексту.",
+ "Write a text that you want the assistant to rewrite in another tone." : "Напишіть текст, який ви хочете, щоб асистент переписав в іншій тональності.",
+ "Desired tone" : "Бажаний тон",
+ "In which tone should your text be rewritten?" : "В якій тональності переписувати текст?",
+ "The rewritten text in the desired tone, written by the assistant:" : "Переписаний текст у потрібній тональності, написаний асистентом:",
"Chat" : "Чат",
+ "Chat with the assistant" : "Чат з асистентом",
+ "The history of chat messages before the current message, starting with a message by the user" : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача",
"Response message" : "Відповідь",
+ "The generated response as part of the conversation" : "Згенерована відповідь як частина розмови",
+ "Chat with tools" : "Чат з інструментами",
+ "Chat with the language model with tool calling support." : "Чат з мовною моделлю з підтримкою виклику інструментів.",
+ "Tool message" : "Повідомлення про інструмент",
+ "The result of tool calls in the last interaction" : "Результат викликів інструментів в останній взаємодії",
"Available tools" : "Доступні інструменти",
+ "The available tools in JSON format" : "Доступні інструменти у форматі JSON",
+ "The response from the chat model" : "Відповідь від чат-моделі",
+ "Tool calls" : "Виклики інструментів",
+ "Tools call instructions from the model in JSON format" : "Інструменти викликають інструкції з моделі у форматі JSON",
+ "Formalize text" : "Формалізуйте текст",
+ "Takes a text and makes it sound more formal" : "Бере текст і робить його більш формальним",
+ "Write a text that you want the assistant to formalize" : "Напишіть текст, який ви хочете, щоб асистент оформив",
+ "Formalized text" : "Формалізований текст",
+ "The formalized text" : "Формалізований текст",
+ "Generate a headline" : "Створіть заголовок",
"Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.",
+ "Original text" : "Оригінальний текст",
+ "The original text to generate a headline for" : "Вихідний текст для створення заголовка для",
+ "The generated headline" : "Згенерований заголовок",
+ "Proofread" : "Вичитано",
+ "Proofreads a text and lists corrections" : "Вичитує текст і складає список виправлень",
"Text" : "Текст",
+ "The text to proofread" : "Текст для вичитки",
+ "Corrections" : "Виправлення",
+ "The corrections that should be made in your text" : "Виправлення, які слід зробити у вашому тексті",
+ "Reformulate text" : "Переформатуйте текст",
+ "Takes a text and reformulates it" : "Бере текст і переформатовує його",
+ "Write a text that you want the assistant to reformulate" : "Напишіть текст, який ви хочете, щоб асистент переформулював",
+ "Reformulated text" : "Переформульований текст",
+ "The reformulated text, written by the assistant" : "Переформульований текст, написаний асистентом",
+ "Simplify text" : "Спростити текст",
+ "Takes a text and simplifies it" : "Бере текст і спрощує його",
+ "Write a text that you want the assistant to simplify" : "Напишіть текст, який ви хочете, щоб асистент спростив",
+ "Simplified text" : "Спрощений текст",
+ "The simplified text" : "Спрощений текст",
"Summarize" : "Підсумок",
+ "Summarizes a text" : "Підсумовує текст",
+ "The original text to summarize" : "Оригінальний текст для підбиття підсумків",
"Summary" : "Загалом",
+ "The generated summary" : "Згенерований підсумок",
"Extract topics" : "Виділити теми",
+ "Extracts topics from a text and outputs them separated by commas" : "Витягує теми з тексту і виводить їх через кому",
+ "The original text to extract topics from" : "Оригінальний текст, з якого можна взяти теми",
+ "Topics" : "Теми",
+ "The list of extracted topics" : "Список витягнутих тем",
"Translate" : "Перекласти",
+ "Translate text from one language to another" : "Перекладіть текст з однієї мови на іншу",
+ "Origin text" : "Вихідний текст",
+ "The text to translate" : "Текст для перекладу",
+ "Origin language" : "Мова походження",
+ "The language of the origin text" : "Мова оригінального тексту",
"Target language" : "Цільова мова",
+ "The desired language to translate the origin text in" : "Бажана мова для перекладу вихідного тексту",
"Result" : "Результат",
+ "The translated text" : "Перекладений текст",
"Free prompt" : "Вільне запрошення",
"Runs an arbitrary prompt through the language model." : "Виконує довільне запрошення через мовну модель.",
"Generate headline" : "Створити заголовок",
diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php
index 2e949fedb51..24876675d60 100644
--- a/lib/private/App/AppStore/Fetcher/Fetcher.php
+++ b/lib/private/App/AppStore/Fetcher/Fetcher.php
@@ -56,7 +56,7 @@ abstract class Fetcher {
*
* @return array
*/
- protected function fetch($ETag, $content) {
+ protected function fetch($ETag, $content, $allowUnstable = false) {
$appstoreenabled = $this->config->getSystemValueBool('appstoreenabled', true);
if ((int)$this->config->getAppValue('settings', 'appstore-fetcher-lastFailure', '0') > time() - self::RETRY_AFTER_FAILURE_SECONDS) {
return [];
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index 0a46109c9f9..2280ac1a79f 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -17,6 +17,7 @@ use OCP\Config\Lexicon\Entry;
use OCP\Config\Lexicon\ILexicon;
use OCP\Config\Lexicon\Preset;
use OCP\Config\Lexicon\Strictness;
+use OCP\Config\ValueType;
use OCP\DB\Exception as DBException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Exceptions\AppConfigIncorrectTypeException;
@@ -1095,6 +1096,49 @@ class AppConfig implements IAppConfig {
}
/**
+ * @inheritDoc
+ *
+ * @param string $app id of the app
+ * @param string $key config key
+ *
+ * @return array{app: string, key: string, lazy?: bool, valueType?: ValueType, valueTypeName?: string, sensitive?: bool, default?: string, definition?: string, note?: string}
+ * @since 32.0.0
+ */
+ public function getKeyDetails(string $app, string $key): array {
+ $this->assertParams($app, $key);
+ try {
+ $details = $this->getDetails($app, $key);
+ } catch (AppConfigUnknownKeyException $e) {
+ $details = [
+ 'app' => $app,
+ 'key' => $key
+ ];
+ }
+
+ /** @var Entry $lexiconEntry */
+ try {
+ $lazy = false;
+ $this->matchAndApplyLexiconDefinition($app, $key, $lazy, lexiconEntry: $lexiconEntry);
+ } catch (AppConfigTypeConflictException|AppConfigUnknownKeyException) {
+ // can be ignored
+ }
+
+ if ($lexiconEntry !== null) {
+ $details = array_merge($details, [
+ 'lazy' => $lexiconEntry->isLazy(),
+ 'valueType' => $lexiconEntry->getValueType(),
+ 'valueTypeName' => $lexiconEntry->getValueType()->name,
+ 'sensitive' => $lexiconEntry->isFlagged(self::FLAG_SENSITIVE),
+ 'default' => $lexiconEntry->getDefault($this->getLexiconPreset()),
+ 'definition' => $lexiconEntry->getDefinition(),
+ 'note' => $lexiconEntry->getNote(),
+ ]);
+ }
+
+ return array_filter($details);
+ }
+
+ /**
* @param string $type
*
* @return int
@@ -1631,6 +1675,7 @@ class AppConfig implements IAppConfig {
?bool &$lazy = null,
int &$type = self::VALUE_MIXED,
?string &$default = null,
+ ?Entry &$lexiconEntry = null,
): bool {
if (in_array($key,
[
@@ -1655,27 +1700,27 @@ class AppConfig implements IAppConfig {
return true;
}
- /** @var Entry $configValue */
- $configValue = $configDetails['entries'][$key];
+ /** @var Entry $lexiconEntry */
+ $lexiconEntry = $configDetails['entries'][$key];
$type &= ~self::VALUE_SENSITIVE;
- $appConfigValueType = $configValue->getValueType()->toAppConfigFlag();
+ $appConfigValueType = $lexiconEntry->getValueType()->toAppConfigFlag();
if ($type === self::VALUE_MIXED) {
$type = $appConfigValueType; // we overwrite if value was requested as mixed
} elseif ($appConfigValueType !== $type) {
throw new AppConfigTypeConflictException('The app config key ' . $app . '/' . $key . ' is typed incorrectly in relation to the config lexicon');
}
- $lazy = $configValue->isLazy();
+ $lazy = $lexiconEntry->isLazy();
// only look for default if needed, default from Lexicon got priority
if ($default !== null) {
- $default = $configValue->getDefault($this->getLexiconPreset()) ?? $default;
+ $default = $lexiconEntry->getDefault($this->getLexiconPreset()) ?? $default;
}
- if ($configValue->isFlagged(self::FLAG_SENSITIVE)) {
+ if ($lexiconEntry->isFlagged(self::FLAG_SENSITIVE)) {
$type |= self::VALUE_SENSITIVE;
}
- if ($configValue->isDeprecated()) {
+ if ($lexiconEntry->isDeprecated()) {
$this->logger->notice('App config key ' . $app . '/' . $key . ' is set as deprecated.');
}
diff --git a/lib/private/AppFramework/Bootstrap/RegistrationContext.php b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
index 94250aad37b..8bd1ff35610 100644
--- a/lib/private/AppFramework/Bootstrap/RegistrationContext.php
+++ b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
@@ -10,7 +10,6 @@ declare(strict_types=1);
namespace OC\AppFramework\Bootstrap;
use Closure;
-use OC\Config\Lexicon\CoreConfigLexicon;
use OC\Support\CrashReport\Registry;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
@@ -144,7 +143,7 @@ class RegistrationContext {
private array $declarativeSettings = [];
/** @var array<array-key, string> */
- private array $configLexiconClasses = ['core' => CoreConfigLexicon::class];
+ private array $configLexiconClasses = [];
/** @var ServiceRegistration<ITeamResourceProvider>[] */
private array $teamResourceProviders = [];
diff --git a/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php b/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php
index e4571dfc50e..b69b129f798 100644
--- a/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php
+++ b/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php
@@ -15,6 +15,7 @@ use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Middleware;
use OCP\ISession;
use OCP\IUserSession;
+use Psr\Log\LoggerInterface;
use ReflectionMethod;
// Will close the session if the user session is ephemeral.
@@ -24,6 +25,7 @@ class FlowV2EphemeralSessionsMiddleware extends Middleware {
private ISession $session,
private IUserSession $userSession,
private ControllerMethodReflector $reflector,
+ private LoggerInterface $logger,
) {
}
@@ -52,6 +54,10 @@ class FlowV2EphemeralSessionsMiddleware extends Middleware {
return;
}
+ $this->logger->info('Closing user and PHP session for ephemeral session', [
+ 'controller' => $controller::class,
+ 'method' => $methodName,
+ ]);
$this->userSession->logout();
$this->session->close();
}
diff --git a/lib/private/Collaboration/Collaborators/Search.php b/lib/private/Collaboration/Collaborators/Search.php
index 32c70549a7b..ea39f885fc6 100644
--- a/lib/private/Collaboration/Collaborators/Search.php
+++ b/lib/private/Collaboration/Collaborators/Search.php
@@ -11,7 +11,7 @@ use OCP\Collaboration\Collaborators\ISearchPlugin;
use OCP\Collaboration\Collaborators\ISearchResult;
use OCP\Collaboration\Collaborators\SearchResultType;
use OCP\IContainer;
-use OCP\Share;
+use OCP\Share\IShare;
class Search implements ISearch {
protected array $pluginList = [];
@@ -81,7 +81,7 @@ class Search implements ISearch {
}
public function registerPlugin(array $pluginInfo): void {
- $shareType = constant(Share::class . '::' . $pluginInfo['shareType']);
+ $shareType = constant(IShare::class . '::' . substr($pluginInfo['shareType'], strlen('SHARE_')));
if ($shareType === null) {
throw new \InvalidArgumentException('Provided ShareType is invalid');
}
diff --git a/lib/private/Config/Lexicon/CoreConfigLexicon.php b/lib/private/Config/Lexicon/CoreConfigLexicon.php
deleted file mode 100644
index de84a58131c..00000000000
--- a/lib/private/Config/Lexicon/CoreConfigLexicon.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace OC\Config\Lexicon;
-
-use OCP\Config\Lexicon\Entry;
-use OCP\Config\Lexicon\ILexicon;
-use OCP\Config\Lexicon\Strictness;
-use OCP\Config\ValueType;
-
-/**
- * ConfigLexicon for 'core' app/user configs
- */
-class CoreConfigLexicon implements ILexicon {
- public function getStrictness(): Strictness {
- return Strictness::IGNORE;
- }
-
- /**
- * @inheritDoc
- * @return Entry[]
- */
- public function getAppConfigs(): array {
- return [
- new Entry('lastcron', ValueType::INT, 0, 'timestamp of last cron execution'),
- ];
- }
-
- /**
- * @inheritDoc
- * @return Entry[]
- */
- public function getUserConfigs(): array {
- return [
- new Entry('lang', ValueType::STRING, null, 'language'),
- ];
- }
-}
diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php
index 4d286cb3068..d9b80b81992 100644
--- a/lib/private/DB/ConnectionFactory.php
+++ b/lib/private/DB/ConnectionFactory.php
@@ -121,21 +121,9 @@ class ConnectionFactory {
case 'oci':
$eventManager->addEventSubscriber(new OracleSessionInit);
- // the driverOptions are unused in dbal and need to be mapped to the parameters
- if (isset($connectionParams['driverOptions'])) {
- $connectionParams = array_merge($connectionParams, $connectionParams['driverOptions']);
- }
- $host = $connectionParams['host'];
- $port = $connectionParams['port'] ?? null;
- $dbName = $connectionParams['dbname'];
-
- // we set the connect string as dbname and unset the host to coerce doctrine into using it as connect string
- if ($host === '') {
- $connectionParams['dbname'] = $dbName; // use dbname as easy connect name
- } else {
- $connectionParams['dbname'] = '//' . $host . (!empty($port) ? ":{$port}" : '') . '/' . $dbName;
- }
- unset($connectionParams['host']);
+ $connectionParams = $this->forceConnectionStringOracle($connectionParams);
+ $connectionParams['primary'] = $this->forceConnectionStringOracle($connectionParams['primary']);
+ $connectionParams['replica'] = array_map([$this, 'forceConnectionStringOracle'], $connectionParams['replica']);
break;
case 'sqlite3':
@@ -265,4 +253,24 @@ class ConnectionFactory {
return $params;
}
+
+ protected function forceConnectionStringOracle(array $connectionParams): array {
+ // the driverOptions are unused in dbal and need to be mapped to the parameters
+ if (isset($connectionParams['driverOptions'])) {
+ $connectionParams = array_merge($connectionParams, $connectionParams['driverOptions']);
+ }
+ $host = $connectionParams['host'];
+ $port = $connectionParams['port'] ?? null;
+ $dbName = $connectionParams['dbname'];
+
+ // we set the connect string as dbname and unset the host to coerce doctrine into using it as connect string
+ if ($host === '') {
+ $connectionParams['dbname'] = $dbName; // use dbname as easy connect name
+ } else {
+ $connectionParams['dbname'] = '//' . $host . (!empty($port) ? ":{$port}" : '') . '/' . $dbName;
+ }
+ unset($connectionParams['host']);
+
+ return $connectionParams;
+ }
}
diff --git a/lib/private/Federation/CloudIdManager.php b/lib/private/Federation/CloudIdManager.php
index 7e7adda3d39..c599d9046a6 100644
--- a/lib/private/Federation/CloudIdManager.php
+++ b/lib/private/Federation/CloudIdManager.php
@@ -14,6 +14,7 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudId;
use OCP\Federation\ICloudIdManager;
+use OCP\Federation\ICloudIdResolver;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IURLGenerator;
@@ -21,27 +22,19 @@ use OCP\IUserManager;
use OCP\User\Events\UserChangedEvent;
class CloudIdManager implements ICloudIdManager {
- /** @var IManager */
- private $contactsManager;
- /** @var IURLGenerator */
- private $urlGenerator;
- /** @var IUserManager */
- private $userManager;
private ICache $memCache;
private ICache $displayNameCache;
- /** @var array[] */
private array $cache = [];
+ /** @var ICloudIdResolver[] */
+ private array $cloudIdResolvers = [];
public function __construct(
- IManager $contactsManager,
- IURLGenerator $urlGenerator,
- IUserManager $userManager,
ICacheFactory $cacheFactory,
IEventDispatcher $eventDispatcher,
+ private IManager $contactsManager,
+ private IURLGenerator $urlGenerator,
+ private IUserManager $userManager,
) {
- $this->contactsManager = $contactsManager;
- $this->urlGenerator = $urlGenerator;
- $this->userManager = $userManager;
$this->memCache = $cacheFactory->createDistributed('cloud_id_');
$this->displayNameCache = $cacheFactory->createDistributed('cloudid_name_');
$eventDispatcher->addListener(UserChangedEvent::class, [$this, 'handleUserEvent']);
@@ -81,6 +74,12 @@ class CloudIdManager implements ICloudIdManager {
public function resolveCloudId(string $cloudId): ICloudId {
// TODO magic here to get the url and user instead of just splitting on @
+ foreach ($this->cloudIdResolvers as $resolver) {
+ if ($resolver->isValidCloudId($cloudId)) {
+ return $resolver->resolveCloudId($cloudId);
+ }
+ }
+
if (!$this->isValidCloudId($cloudId)) {
throw new \InvalidArgumentException('Invalid cloud id');
}
@@ -251,6 +250,26 @@ class CloudIdManager implements ICloudIdManager {
* @return bool
*/
public function isValidCloudId(string $cloudId): bool {
- return str_contains($cloudId, '@');
+ foreach ($this->cloudIdResolvers as $resolver) {
+ if ($resolver->isValidCloudId($cloudId)) {
+ return true;
+ }
+ }
+
+ return strpos($cloudId, '@') !== false;
+ }
+
+ public function createCloudId(string $id, string $user, string $remote, ?string $displayName = null): ICloudId {
+ return new CloudId($id, $user, $remote, $displayName);
+ }
+
+ public function registerCloudIdResolver(ICloudIdResolver $resolver): void {
+ array_unshift($this->cloudIdResolvers, $resolver);
+ }
+
+ public function unregisterCloudIdResolver(ICloudIdResolver $resolver): void {
+ if (($key = array_search($resolver, $this->cloudIdResolvers)) !== false) {
+ array_splice($this->cloudIdResolvers, $key, 1);
+ }
}
}
diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php
index 48c069de0b9..8fe56cf060c 100644
--- a/lib/private/Files/Filesystem.php
+++ b/lib/private/Files/Filesystem.php
@@ -8,6 +8,7 @@
namespace OC\Files;
use OC\Files\Mount\MountPoint;
+use OC\Files\Storage\StorageFactory;
use OC\User\NoUserException;
use OCP\Cache\CappedMemoryCache;
use OCP\EventDispatcher\IEventDispatcher;
@@ -178,7 +179,9 @@ class Filesystem {
}
$mounts = self::getMountManager()->getAll();
- if (!self::getLoader()->addStorageWrapper($wrapperName, $wrapper, $priority, $mounts)) {
+ /** @var StorageFactory $loader */
+ $loader = self::getLoader();
+ if (!$loader->addStorageWrapper($wrapperName, $wrapper, $priority, $mounts)) {
// do not re-wrap if storage with this name already existed
return;
}
diff --git a/lib/private/Lockdown/Filesystem/NullStorage.php b/lib/private/Lockdown/Filesystem/NullStorage.php
index 71a40d8da1e..fd952fae637 100644
--- a/lib/private/Lockdown/Filesystem/NullStorage.php
+++ b/lib/private/Lockdown/Filesystem/NullStorage.php
@@ -30,7 +30,7 @@ class NullStorage extends Common {
}
public function opendir(string $path): IteratorDirectory {
- return new IteratorDirectory([]);
+ return new IteratorDirectory();
}
public function is_dir(string $path): bool {
diff --git a/lib/private/Server.php b/lib/private/Server.php
index d339a97baab..171fee2afa1 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -1160,11 +1160,11 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerService(ICloudIdManager::class, function (ContainerInterface $c) {
return new CloudIdManager(
+ $c->get(ICacheFactory::class),
+ $c->get(IEventDispatcher::class),
$c->get(\OCP\Contacts\IManager::class),
$c->get(IURLGenerator::class),
$c->get(IUserManager::class),
- $c->get(ICacheFactory::class),
- $c->get(IEventDispatcher::class),
);
});
diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php
index baff04fbc4a..c55caee6f0a 100644
--- a/lib/private/Share/Constants.php
+++ b/lib/private/Share/Constants.php
@@ -7,56 +7,7 @@
*/
namespace OC\Share;
-use OCP\Share\IShare;
-
class Constants {
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_USER instead
- */
- public const SHARE_TYPE_USER = 0;
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_GROUP instead
- */
- public const SHARE_TYPE_GROUP = 1;
- // const SHARE_TYPE_USERGROUP = 2; // Internal type used by DefaultShareProvider
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_LINK instead
- */
- public const SHARE_TYPE_LINK = 3;
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_EMAIL instead
- */
- public const SHARE_TYPE_EMAIL = 4;
- public const SHARE_TYPE_CONTACT = 5; // ToDo Check if it is still in use otherwise remove it
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_REMOTE instead
- */
- public const SHARE_TYPE_REMOTE = 6;
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_CIRCLE instead
- */
- public const SHARE_TYPE_CIRCLE = 7;
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_GUEST instead
- */
- public const SHARE_TYPE_GUEST = 8;
- /**
- * @deprecated 17.0.0 - use IShare::REMOTE_GROUP instead
- */
- public const SHARE_TYPE_REMOTE_GROUP = 9;
- /**
- * @deprecated 17.0.0 - use IShare::TYPE_ROOM instead
- */
- public const SHARE_TYPE_ROOM = 10;
- // const SHARE_TYPE_USERROOM = 11; // Internal type used by RoomShareProvider
- /**
- * @deprecated 21.0.0 - use IShare::TYPE_DECK instead
- */
- public const SHARE_TYPE_DECK = 12;
- // const SHARE_TYPE_DECK_USER = 13; // Internal type used by DeckShareProvider
-
- // Note to developers: Do not add new share types here
-
public const FORMAT_NONE = -1;
public const FORMAT_STATUSES = -2;
public const FORMAT_SOURCES = -3; // ToDo Check if it is still in use otherwise remove it
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index e1eebe1e450..5300e6e1baa 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -13,12 +13,14 @@ use OC\Share20\Exception\BackendError;
use OC\Share20\Exception\InvalidShare;
use OC\Share20\Exception\ProviderException;
use OC\User\LazyUser;
+use OCA\Files_Sharing\AppInfo\Application;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Defaults;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
+use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IL10N;
@@ -43,9 +45,6 @@ use function str_starts_with;
* @package OC\Share20
*/
class DefaultShareProvider implements IShareProviderWithNotification, IShareProviderSupportsAccept, IShareProviderSupportsAllSharesInFolder {
- // Special share type for user modified group shares
- public const SHARE_TYPE_USERGROUP = 2;
-
public function __construct(
private IDBConnection $dbConn,
private IUserManager $userManager,
@@ -58,6 +57,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
private ITimeFactory $timeFactory,
private LoggerInterface $logger,
private IManager $shareManager,
+ private IConfig $config,
) {
}
@@ -127,9 +127,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
$qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
}
- if (method_exists($share, 'getParent')) {
- $qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
- }
+ $qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
$qb->setValue('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0, IQueryBuilder::PARAM_INT));
} else {
@@ -284,7 +282,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATETIME_MUTABLE))
->set('note', $qb->createNamedParameter($share->getNote()))
->set('label', $qb->createNamedParameter($share->getLabel()))
- ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
+ ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0, IQueryBuilder::PARAM_INT))
->executeStatement();
}
@@ -358,14 +356,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
return $share;
}
- /**
- * Get all children of this share
- * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
- *
- * @param \OCP\Share\IShare $parent
- * @return \OCP\Share\IShare[]
- */
- public function getChildren(\OCP\Share\IShare $parent) {
+ public function getChildren(IShare $parent): array {
$children = [];
$qb = $this->dbConn->getQueryBuilder();
@@ -485,6 +476,15 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
protected function createUserSpecificGroupShare(IShare $share, string $recipient): int {
$type = $share->getNodeType();
+ $shareFolder = $this->config->getSystemValue('share_folder', '/');
+ $allowCustomShareFolder = $this->config->getSystemValueBool('sharing.allow_custom_share_folder', true);
+ if ($allowCustomShareFolder) {
+ $shareFolder = $this->config->getUserValue($recipient, Application::APP_ID, 'share_folder', $shareFolder);
+ }
+
+ $target = $shareFolder . '/' . $share->getNode()->getName();
+ $target = \OC\Files\Filesystem::normalizePath($target);
+
$qb = $this->dbConn->getQueryBuilder();
$qb->insert('share')
->values([
@@ -496,7 +496,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
'item_type' => $qb->createNamedParameter($type),
'item_source' => $qb->createNamedParameter($share->getNodeId()),
'file_source' => $qb->createNamedParameter($share->getNodeId()),
- 'file_target' => $qb->createNamedParameter($share->getTarget()),
+ 'file_target' => $qb->createNamedParameter($target),
'permissions' => $qb->createNamedParameter($share->getPermissions()),
'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
])->executeStatement();
diff --git a/lib/private/Share20/LegacyHooks.php b/lib/private/Share20/LegacyHooks.php
index 3bce0b9560a..d54c8e3203d 100644
--- a/lib/private/Share20/LegacyHooks.php
+++ b/lib/private/Share20/LegacyHooks.php
@@ -82,7 +82,7 @@ class LegacyHooks {
'itemSource' => $share->getNodeId(),
'shareType' => $shareType,
'shareWith' => $sharedWith,
- 'itemparent' => method_exists($share, 'getParent') ? $share->getParent() : '',
+ 'itemparent' => $share->getParent(),
'uidOwner' => $share->getSharedBy(),
'fileSource' => $share->getNodeId(),
'fileTarget' => $share->getTarget()
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 01664c6a0a3..855bb173d56 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -7,11 +7,13 @@
*/
namespace OC\Share20;
+use OC\Core\AppInfo\ConfigLexicon;
use OC\Files\Mount\MoveableMount;
use OC\KnownUser\KnownUserService;
use OC\Share20\Exception\ProviderException;
use OCA\Files_Sharing\AppInfo\Application;
use OCA\Files_Sharing\SharedStorage;
+use OCA\ShareByMail\ShareByMailProvider;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\File;
use OCP\Files\Folder;
@@ -579,13 +581,10 @@ class Manager implements IManager {
* @param IShare $share
*/
protected function setLinkParent(IShare $share) {
- // No sense in checking if the method is not there.
- if (method_exists($share, 'setParent')) {
- $storage = $share->getNode()->getStorage();
- if ($storage->instanceOfStorage(SharedStorage::class)) {
- /** @var \OCA\Files_Sharing\SharedStorage $storage */
- $share->setParent($storage->getShareId());
- }
+ $storage = $share->getNode()->getStorage();
+ if ($storage->instanceOfStorage(SharedStorage::class)) {
+ /** @var \OCA\Files_Sharing\SharedStorage $storage */
+ $share->setParent((int)$storage->getShareId());
}
}
@@ -704,12 +703,12 @@ class Manager implements IManager {
}
// Generate the target
- $defaultShareFolder = $this->config->getSystemValue('share_folder', '/');
- $allowCustomShareFolder = $this->config->getSystemValueBool('sharing.allow_custom_share_folder', true);
- if ($allowCustomShareFolder) {
- $shareFolder = $this->config->getUserValue($share->getSharedWith(), Application::APP_ID, 'share_folder', $defaultShareFolder);
- } else {
- $shareFolder = $defaultShareFolder;
+ $shareFolder = $this->config->getSystemValue('share_folder', '/');
+ if ($share->getShareType() === IShare::TYPE_USER) {
+ $allowCustomShareFolder = $this->config->getSystemValueBool('sharing.allow_custom_share_folder', true);
+ if ($allowCustomShareFolder) {
+ $shareFolder = $this->config->getUserValue($share->getSharedWith(), Application::APP_ID, 'share_folder', $shareFolder);
+ }
}
$target = $shareFolder . '/' . $share->getNode()->getName();
@@ -869,6 +868,7 @@ class Manager implements IManager {
// Now update the share!
$provider = $this->factory->getProviderForType($share->getShareType());
if ($share->getShareType() === IShare::TYPE_EMAIL) {
+ /** @var ShareByMailProvider $provider */
$share = $provider->update($share, $plainTextPassword);
} else {
$share = $provider->update($share);
@@ -1006,7 +1006,6 @@ class Manager implements IManager {
/**
* Delete all the children of this share
- * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
*
* @param IShare $share
* @return IShare[] List of deleted shares
@@ -1937,7 +1936,7 @@ class Manager implements IManager {
}
public function allowCustomTokens(): bool {
- return $this->appConfig->getValueBool('core', 'shareapi_allow_custom_tokens', false);
+ return $this->appConfig->getValueBool('core', ConfigLexicon::SHARE_CUSTOM_TOKEN);
}
public function allowViewWithoutDownload(): bool {
diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php
index 8caabb0898a..571efc8c4be 100644
--- a/lib/private/Share20/Share.php
+++ b/lib/private/Share20/Share.php
@@ -60,8 +60,7 @@ class Share implements IShare {
private $sendPasswordByTalk = false;
/** @var string */
private $token;
- /** @var int */
- private $parent;
+ private ?int $parent = null;
/** @var string */
private $target;
/** @var \DateTime */
@@ -526,25 +525,12 @@ class Share implements IShare {
return $this->token;
}
- /**
- * Set the parent of this share
- *
- * @param int $parent
- * @return IShare
- * @deprecated 12.0.0 The new shares do not have parents. This is just here for legacy reasons.
- */
- public function setParent($parent) {
+ public function setParent(int $parent): self {
$this->parent = $parent;
return $this;
}
- /**
- * Get the parent of this share.
- *
- * @return int
- * @deprecated 12.0.0 The new shares do not have parents. This is just here for legacy reasons.
- */
- public function getParent() {
+ public function getParent(): ?int {
return $this->parent;
}
diff --git a/lib/private/Template/JSConfigHelper.php b/lib/private/Template/JSConfigHelper.php
index de9df04ae4b..07e557d0706 100644
--- a/lib/private/Template/JSConfigHelper.php
+++ b/lib/private/Template/JSConfigHelper.php
@@ -70,6 +70,8 @@ class JSConfigHelper {
$userBackendAllowsPasswordConfirmation = $backend->canConfirmPassword($uid) && $this->canUserValidatePassword();
} elseif (isset($this->excludedUserBackEnds[$this->currentUser->getBackendClassName()])) {
$userBackendAllowsPasswordConfirmation = false;
+ } else {
+ $userBackendAllowsPasswordConfirmation = $this->canUserValidatePassword();
}
} else {
$uid = null;
diff --git a/lib/public/Calendar/ICreateFromString.php b/lib/public/Calendar/ICreateFromString.php
index 5badaa2d4cf..2bb0f2ffa20 100644
--- a/lib/public/Calendar/ICreateFromString.php
+++ b/lib/public/Calendar/ICreateFromString.php
@@ -17,9 +17,31 @@ use OCP\Calendar\Exceptions\CalendarException;
*/
interface ICreateFromString extends ICalendar {
/**
- * @since 23.0.0
+ * Create an event in this calendar from an ICS string.
+ *
+ * @param string $name the file name - needs to contain the .ics ending
+ * @param string $calendarData a string containing a valid VEVENT ics
*
* @throws CalendarException
+ *
+ * @since 23.0.0
+ *
*/
public function createFromString(string $name, string $calendarData): void;
+
+ /**
+ * Create an event in this calendar from an ICS string using a minimal CalDAV server.
+ * Usually, the createFromString() method should be preferred.
+ *
+ * However, in some cases it is useful to not set up a full CalDAV server.
+ * Missing features include no iMIP plugin, no invitation emails amongst others.
+ *
+ * @param string $name the file name - needs to contain the .ics ending
+ * @param string $calendarData a string containing a valid VEVENT ics
+ *
+ * @throws CalendarException
+ *
+ * @since 32.0.0
+ */
+ public function createFromStringMinimal(string $name, string $calendarData): void;
}
diff --git a/lib/public/Config/BeforePreferenceDeletedEvent.php b/lib/public/Config/BeforePreferenceDeletedEvent.php
index c7026b0f6fc..df89a2900bd 100644
--- a/lib/public/Config/BeforePreferenceDeletedEvent.php
+++ b/lib/public/Config/BeforePreferenceDeletedEvent.php
@@ -8,11 +8,10 @@ declare(strict_types=1);
namespace OCP\Config;
+use OCP\AppFramework\Attribute\Listenable;
use OCP\EventDispatcher\Event;
-/**
- * @since 25.0.0
- */
+#[Listenable(since: '25.0.0')]
class BeforePreferenceDeletedEvent extends Event {
protected string $userId;
protected string $appId;
diff --git a/lib/public/Config/BeforePreferenceSetEvent.php b/lib/public/Config/BeforePreferenceSetEvent.php
index c5abb8429a8..6534e4ae371 100644
--- a/lib/public/Config/BeforePreferenceSetEvent.php
+++ b/lib/public/Config/BeforePreferenceSetEvent.php
@@ -8,11 +8,10 @@ declare(strict_types=1);
namespace OCP\Config;
+use OCP\AppFramework\Attribute\Listenable;
use OCP\EventDispatcher\Event;
-/**
- * @since 25.0.0
- */
+#[Listenable(since: '25.0.0')]
class BeforePreferenceSetEvent extends Event {
protected string $userId;
protected string $appId;
diff --git a/lib/public/Config/Exceptions/IncorrectTypeException.php b/lib/public/Config/Exceptions/IncorrectTypeException.php
index 33c545c7eea..dea33233bfe 100644
--- a/lib/public/Config/Exceptions/IncorrectTypeException.php
+++ b/lib/public/Config/Exceptions/IncorrectTypeException.php
@@ -9,9 +9,8 @@ declare(strict_types=1);
namespace OCP\Config\Exceptions;
use Exception;
+use OCP\AppFramework\Attribute\Throwable;
-/**
- * @since 32.0.0
- */
+#[Throwable(since: '32.0.0')]
class IncorrectTypeException extends Exception {
}
diff --git a/lib/public/Config/Exceptions/TypeConflictException.php b/lib/public/Config/Exceptions/TypeConflictException.php
index 4b63bb0a763..c78602180e0 100644
--- a/lib/public/Config/Exceptions/TypeConflictException.php
+++ b/lib/public/Config/Exceptions/TypeConflictException.php
@@ -9,9 +9,8 @@ declare(strict_types=1);
namespace OCP\Config\Exceptions;
use Exception;
+use OCP\AppFramework\Attribute\Throwable;
-/**
- * @since 32.0.0
- */
+#[Throwable(since: '32.0.0')]
class TypeConflictException extends Exception {
}
diff --git a/lib/public/Config/Exceptions/UnknownKeyException.php b/lib/public/Config/Exceptions/UnknownKeyException.php
index 39da4d43d95..beca4c496a2 100644
--- a/lib/public/Config/Exceptions/UnknownKeyException.php
+++ b/lib/public/Config/Exceptions/UnknownKeyException.php
@@ -9,9 +9,8 @@ declare(strict_types=1);
namespace OCP\Config\Exceptions;
use Exception;
+use OCP\AppFramework\Attribute\Throwable;
-/**
- * @since 32.0.0
- */
+#[Throwable(since: '32.0.0')]
class UnknownKeyException extends Exception {
}
diff --git a/lib/public/Config/IUserConfig.php b/lib/public/Config/IUserConfig.php
index 1179db2671f..cb42608ea75 100644
--- a/lib/public/Config/IUserConfig.php
+++ b/lib/public/Config/IUserConfig.php
@@ -27,8 +27,6 @@ use OCP\Config\Exceptions\UnknownKeyException;
* Similarly, some methods from this class are marked with a warning about ignoring
* lazy loading. Use them wisely and only on parts of the code that are called
* during specific requests or actions to avoid loading the lazy values all the time.
- *
- * @since 32.0.0
*/
#[Consumable(since: '32.0.0')]
interface IUserConfig {
diff --git a/lib/public/Config/Lexicon/Entry.php b/lib/public/Config/Lexicon/Entry.php
index 95dae44ed11..c810522dde5 100644
--- a/lib/public/Config/Lexicon/Entry.php
+++ b/lib/public/Config/Lexicon/Entry.php
@@ -9,29 +9,34 @@ declare(strict_types=1);
namespace OCP\Config\Lexicon;
use Closure;
+use OCP\AppFramework\Attribute\Consumable;
use OCP\Config\ValueType;
/**
* Model that represent config values within an app config lexicon.
*
* @see ILexicon
- * @since 32.0.0
*/
+#[Consumable(since: '32.0.0')]
class Entry {
/** @since 32.0.0 */
public const RENAME_INVERT_BOOLEAN = 1;
private string $definition = '';
+ private string $note = '';
private ?string $default = null;
/**
- * @param string $key config key, can only contain alphanumerical chars and -._
+ * @param string $key config key; can only contain alphanumerical chars and underscore "_"
* @param ValueType $type type of config value
+ * @param string|int|float|bool|array|Closure|null $defaultRaw default value to be used in case none known
* @param string $definition optional description of config key available when using occ command
* @param bool $lazy set config value as lazy
* @param int $flags set flags
- * @param string|null $rename previous config key to migrate config value from
* @param bool $deprecated set config key as deprecated
+ * @param string|null $rename source in case of a rename of a config key.
+ * @param int $options additional bitflag options {@see self::RENAME_INVERT_BOOLEAN}
+ * @param string $note additional note and warning related to the use of the config key.
*
* @since 32.0.0
* @psalm-suppress PossiblyInvalidCast
@@ -47,6 +52,7 @@ class Entry {
private readonly bool $deprecated = false,
private readonly ?string $rename = null,
private readonly int $options = 0,
+ string $note = '',
) {
// key can only contain alphanumeric chars and underscore "_"
if (preg_match('/[^[:alnum:]_]/', $key)) {
@@ -56,6 +62,7 @@ class Entry {
/** @psalm-suppress UndefinedClass */
if (\OC::$CLI) { // only store definition if ran from CLI
$this->definition = $definition;
+ $this->note = $note;
}
}
@@ -187,6 +194,16 @@ class Entry {
}
/**
+ * returns eventual note
+ *
+ * @return string
+ * @since 32.0.0
+ */
+ public function getNote(): string {
+ return $this->note;
+ }
+
+ /**
* returns if config key is set as lazy
*
* @see IAppConfig for details on lazy config values
diff --git a/lib/public/Config/Lexicon/ILexicon.php b/lib/public/Config/Lexicon/ILexicon.php
index 1dde23714cb..05bf5967f24 100644
--- a/lib/public/Config/Lexicon/ILexicon.php
+++ b/lib/public/Config/Lexicon/ILexicon.php
@@ -8,16 +8,12 @@ declare(strict_types=1);
namespace OCP\Config\Lexicon;
-use OCP\AppFramework\Attribute\Consumable;
use OCP\AppFramework\Attribute\Implementable;
/**
* This interface needs to be implemented if you want to define a config lexicon for your application
* The config lexicon is used to avoid conflicts and problems when storing/retrieving config values
- *
- * @since 32.0.0
*/
-#[Consumable(since: '32.0.0')]
#[Implementable(since: '32.0.0')]
interface ILexicon {
diff --git a/lib/public/Config/Lexicon/Preset.php b/lib/public/Config/Lexicon/Preset.php
index ba0fb66dd3b..6dac8736131 100644
--- a/lib/public/Config/Lexicon/Preset.php
+++ b/lib/public/Config/Lexicon/Preset.php
@@ -8,6 +8,8 @@ declare(strict_types=1);
namespace OCP\Config\Lexicon;
+use OCP\AppFramework\Attribute\Consumable;
+
/**
* list of preset to handle the default behavior of the instance
*
@@ -22,9 +24,8 @@ namespace OCP\Config\Lexicon;
* - **Preset::CLUB** - Club/Association
* - **Preset::FAMILY** - Family
* - **Preset::PRIVATE** - Private
- *
- * @since 32.0.0
*/
+#[Consumable(since: '32.0.0')]
enum Preset: int {
/** @since 32.0.0 */
case LARGE = 9;
diff --git a/lib/public/Config/Lexicon/Strictness.php b/lib/public/Config/Lexicon/Strictness.php
index 48e96bfc91c..8136499cb3e 100644
--- a/lib/public/Config/Lexicon/Strictness.php
+++ b/lib/public/Config/Lexicon/Strictness.php
@@ -8,6 +8,8 @@ declare(strict_types=1);
namespace OCP\Config\Lexicon;
+use OCP\AppFramework\Attribute\Consumable;
+
/**
* Strictness regarding using not-listed config keys
*
@@ -15,9 +17,8 @@ namespace OCP\Config\Lexicon;
* - **Strictness::NOTICE** - ignore and report
* - **Strictness::WARNING** - silently block (returns $default) and report
* - **Strictness::EXCEPTION** - block (throws exception) and report
- *
- * @since 32.0.0
*/
+#[Consumable(since: '32.0.0')]
enum Strictness {
/** @since 32.0.0 */
case IGNORE; // fully ignore
diff --git a/lib/public/Config/ValueType.php b/lib/public/Config/ValueType.php
index a622c671898..32c734af32b 100644
--- a/lib/public/Config/ValueType.php
+++ b/lib/public/Config/ValueType.php
@@ -8,15 +8,15 @@ declare(strict_types=1);
namespace OCP\Config;
+use OCP\AppFramework\Attribute\Consumable;
use OCP\Config\Exceptions\IncorrectTypeException;
use OCP\IAppConfig;
use UnhandledMatchError;
/**
* Listing of available value type for typed config value
- *
- * @since 32.0.0
*/
+#[Consumable(since: '32.0.0')]
enum ValueType: int {
/**
* @since 32.0.0
diff --git a/lib/public/Federation/ICloudIdManager.php b/lib/public/Federation/ICloudIdManager.php
index 03b6ced18f5..29e261ab3af 100644
--- a/lib/public/Federation/ICloudIdManager.php
+++ b/lib/public/Federation/ICloudIdManager.php
@@ -8,11 +8,14 @@ declare(strict_types=1);
*/
namespace OCP\Federation;
+use OCP\AppFramework\Attribute\Consumable;
+
/**
* Interface for resolving federated cloud ids
*
* @since 12.0.0
*/
+#[Consumable(since: '12.0.0')]
interface ICloudIdManager {
/**
* @param string $cloudId
@@ -55,4 +58,28 @@ interface ICloudIdManager {
* @since 30.0.0 - Optional parameter $httpsOnly was added
*/
public function removeProtocolFromUrl(string $url, bool $httpsOnly = false): string;
+
+ /**
+ * @param string $id The remote cloud id
+ * @param string $user The user id on the remote server
+ * @param string $remote The base address of the remote server
+ * @param ?string $displayName The displayname of the remote user
+ *
+ * @since 32.0.0
+ */
+ public function createCloudId(string $id, string $user, string $remote, ?string $displayName = null): ICloudId;
+
+ /**
+ * @param $resolver The cloud id resolver to register
+ *
+ * @since 32.0.0
+ */
+ public function registerCloudIdResolver(ICloudIdResolver $resolver): void;
+
+ /**
+ * @param $resolver The cloud id resolver to unregister
+ *
+ * @since 32.0.0
+ */
+ public function unregisterCloudIdResolver(ICloudIdResolver $resolver): void;
}
diff --git a/lib/public/Federation/ICloudIdResolver.php b/lib/public/Federation/ICloudIdResolver.php
new file mode 100644
index 00000000000..79f9ed11dd7
--- /dev/null
+++ b/lib/public/Federation/ICloudIdResolver.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+namespace OCP\Federation;
+
+use OCP\AppFramework\Attribute\Consumable;
+use OCP\AppFramework\Attribute\Implementable;
+
+/**
+ * Interface for resolving federated cloud ids
+ *
+ * @since 32.0.0
+ */
+#[Consumable(since: '32.0.0')]
+#[Implementable(since: '32.0.0')]
+interface ICloudIdResolver {
+ /**
+ * @param string $cloudId
+ * @return ICloudId
+ * @throws \InvalidArgumentException
+ *
+ * @since 32.0.0
+ */
+ public function resolveCloudId(string $cloudId): ICloudId;
+
+ /**
+ * Check if the input is a correctly formatted cloud id
+ *
+ * @param string $cloudId
+ * @return bool
+ *
+ * @since 32.0.0
+ */
+ public function isValidCloudId(string $cloudId): bool;
+}
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index 68d4332146e..d9e3e0d95a7 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -8,6 +8,7 @@ declare(strict_types=1);
*/
namespace OCP;
+use OCP\Config\ValueType;
use OCP\Exceptions\AppConfigUnknownKeyException;
/**
@@ -450,6 +451,33 @@ interface IAppConfig {
public function getDetails(string $app, string $key): array;
/**
+ * returns an array containing details about a config key.
+ * key/value pair are available only if it exists.
+ *
+ * ```
+ * [
+ * "app" => "myapp",
+ * "key" => "mykey",
+ * "value" => "current_value",
+ * "default" => "default_if_available",
+ * "definition" => "this is what it does",
+ * "note" => "enabling this is not compatible with that",
+ * "lazy" => false,
+ * "type" => 4,
+ * "typeString" => "string",
+ * 'sensitive' => false
+ * ]
+ * ```
+ *
+ * @param string $app id of the app
+ * @param string $key config key
+ *
+ * @return array{app: string, key: string, lazy?: bool, valueType?: ValueType, valueTypeName?: string, sensitive?: bool, default?: string, definition?: string, note?: string}
+ * @since 32.0.0
+ */
+ public function getKeyDetails(string $app, string $key): array;
+
+ /**
* Convert string like 'string', 'integer', 'float', 'bool' or 'array' to
* to bitflag {@see VALUE_STRING}, {@see VALUE_INT}, {@see VALUE_FLOAT},
* {@see VALUE_BOOL} and {@see VALUE_ARRAY}
diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php
index 5d8c64e1314..a1bdb01fcd2 100644
--- a/lib/public/Share/IShare.php
+++ b/lib/public/Share/IShare.php
@@ -530,6 +530,20 @@ interface IShare {
public function getToken();
/**
+ * Set the parent of this share
+ *
+ * @since 9.0.0
+ */
+ public function setParent(int $parent): self;
+
+ /**
+ * Get the parent of this share.
+ *
+ * @since 9.0.0
+ */
+ public function getParent(): ?int;
+
+ /**
* Set the target path of this share relative to the recipients user folder.
*
* @param string $target
diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php
index 9d7c8013a36..23187ca833e 100644
--- a/lib/public/Share/IShareProvider.php
+++ b/lib/public/Share/IShareProvider.php
@@ -208,4 +208,12 @@ interface IShareProvider {
* @since 18.0.0
*/
public function getAllShares(): iterable;
+
+ /**
+ * Get all children of this share
+ *
+ * @return IShare[]
+ * @since 9.0.0
+ */
+ public function getChildren(IShare $parent);
}