From 74f26133a7480e1234aca421323c2490945eda53 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:13 +0200 Subject: [PATCH 01/99] New translations blobclass.md (Japanese) --- i18n/ja/docusaurus-plugin-content-docs/current/API/BlobClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/BlobClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/BlobClass.md index 499cc3640c35d6..ed29479f54d509 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/BlobClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/BlobClass.md @@ -7,7 +7,7 @@ Blobクラスを使って、[BLOB オブジェクト](../Concepts/dt_blob.md#BLO :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From a6bc532320f7f24f6e670bbefaa0225fca6db147 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:20 +0200 Subject: [PATCH 02/99] New translations collectionclass.md (Japanese) --- .../current/API/CollectionClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/CollectionClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/CollectionClass.md index 6320f308b428d5..0682ac05945ff6 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/CollectionClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/CollectionClass.md @@ -9,7 +9,7 @@ Collectionクラスは [コレクション](Concepts/dt_collection.md) 型の式 :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From 4a5e3b4e40ed649617d9f3ac5b28cc1f75583aa1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:22 +0200 Subject: [PATCH 03/99] New translations emailobjectclass.md (Japanese) --- .../current/API/EmailObjectClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/EmailObjectClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/EmailObjectClass.md index 701dac53cae3b9..9586cfcc410b97 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/EmailObjectClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/EmailObjectClass.md @@ -19,7 +19,7 @@ title: Email :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From f6254862f9e904b46d53c4ee71ff3a5b9b0a5c93 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:25 +0200 Subject: [PATCH 04/99] New translations fileclass.md (Japanese) --- i18n/ja/docusaurus-plugin-content-docs/current/API/FileClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/FileClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/FileClass.md index 09e29a626f8701..fd617bdf53111a 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/FileClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/FileClass.md @@ -7,7 +7,7 @@ title: File :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From 3deb65400733b716e96c068ee9601efbd45b0786 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:27 +0200 Subject: [PATCH 05/99] New translations folderclass.md (Japanese) --- .../docusaurus-plugin-content-docs/current/API/FolderClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/FolderClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/FolderClass.md index f3ec76126dd497..6b0e0fcfaf2b01 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/FolderClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/FolderClass.md @@ -7,7 +7,7 @@ title: Folder :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From 9df94e436e58903b38a0647ca4c622978153d800 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:29 +0200 Subject: [PATCH 06/99] New translations mailattachmentclass.md (Japanese) --- .../current/API/MailAttachmentClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/MailAttachmentClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/MailAttachmentClass.md index 6ee0f348c50ec0..839bc9ffd7310c 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/MailAttachmentClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/MailAttachmentClass.md @@ -7,7 +7,7 @@ Attachment オブジェクトによって、[`Email`](EmailObjectClass.md) オ :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From f0151b8fe3d6e82dc6d44c23dad73631f3cf9e81 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:31 +0200 Subject: [PATCH 07/99] New translations vectorclass.md (Japanese) --- .../docusaurus-plugin-content-docs/current/API/VectorClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/VectorClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/VectorClass.md index c78b1fd626513f..2d42f83abd9979 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/VectorClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/VectorClass.md @@ -9,7 +9,7 @@ AI の世界では、ベクトルとは、機会が複雑なデータを理解 :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From 6195a5883d3ec511f6604b75466a5d19a3b57dd0 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:33 +0200 Subject: [PATCH 08/99] New translations formulaclass.md (Japanese) --- .../docusaurus-plugin-content-docs/current/API/FormulaClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/FormulaClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/FormulaClass.md index 82697c41a6b328..c4f215a5b84a7d 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/FormulaClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/FormulaClass.md @@ -14,7 +14,7 @@ title: Formula :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From c575fa3c17c7e245e021e3340acf72b743017194 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 13:41:35 +0200 Subject: [PATCH 09/99] New translations methodclass.md (Japanese) --- .../docusaurus-plugin-content-docs/current/API/MethodClass.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md index bd7a2ec3957cef..1681defc4cbcfb 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md @@ -22,7 +22,7 @@ title: メソッド :::info -This class is [**streamable**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) in binary. +このクラスは、バイナリーで[**ストリーム可能**](../Concepts/dt_object.md#binary-streaming-variable-to-blob) です。 ::: From dda12188c58afd9068ee2718488a6b80638d6ad3 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:25 +0200 Subject: [PATCH 10/99] New translations imaptransporterclass.md (Spanish) --- .../version-19/API/IMAPTransporterClass.md | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md index 0801276cdc78cc..df4fc8236cd869 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md @@ -72,18 +72,18 @@ El comando `IMAP New transporter` ](#acceptunsecureconnection)    | False | -| .**accessTokenOAuth2**: Text
.**accessTokenOAuth2**: Object
Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](#checkconnectiondelay)    | 300 | -| [](#connectiontimeout)    | 30 | -| [](#host)    | *mandatory* | -| [](#logfile)    | ninguno | -| .**password**: Text
Contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | -| [](#port)    | 993 | -| [](#user)    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](#acceptunsecureconnection)    | False | +| .**accessTokenOAuth2**: Text
.**accessTokenOAuth2**: Object
Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | +| [](#authenticationmode)    | the most secure authentication mode supported by the server is used | +| [](#checkconnectiondelay)    | 300 | +| [](#connectiontimeout)    | 30 | +| [](#host)    | *mandatory* | +| [](#logfile)    | ninguno | +| .**password**: Text
Contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | +| [](#port)    | 993 | +| [](#user)    | ninguno | > **Atención**: asegúrese de que el tiempo de espera definido sea menor que el tiempo de espera del servidor, de lo contrario el tiempo de espera del cliente será inútil. #### Resultado @@ -351,12 +351,12 @@ La propiedad `.checkConnectionDelay` contiene
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|destinationBox|Text|->|Mailbox to receive copied messages| -|Result|Object|<-|Status of the copy operation| +|msgsIDs|Collection|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|destinationBox|Text|->|Buzón para recibir los mensajes copiados| +|Resultado|Object|<-|Status of the copy operation|
@@ -535,11 +535,11 @@ End for each
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|Result|Object|<-|Status of the delete operation| +|msgsIDs|Colección|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|Resultado|Object|<-|Status of the delete operation|
@@ -968,12 +968,12 @@ Caracter delimitador del nombre del buzón.
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|->|Sequence number of the message| -|msgID|Text|->|Unique ID of the message| -|options|Object|->|Message handling instructions| -|Result|Object|<-|[Email object](EmailObjectClass.md#email-object)| +|msgNumber|Integer|->|Número de secuencia del mensaje| +|msgID|Text|->|Identificación única del mensaje| +|options|Object|->|Instrucciones de gestión del mensaje| +|Resultado|Object|<-|[Email object](EmailObjectClass.md#email-object)|
@@ -1044,13 +1044,13 @@ Quiere obtener el mensaje con ID = 1:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|ids |Collection|->|Collection of message ID| -|startMsg|Integer|->|Sequence number of the first message| -|endMsg |Integer|->|Sequence number of the last message| -|options|Object|->|Message handling instructions| -|Result|Object|<-|Object containing:
  • una colección de [objetos Email](EmailObjectClass.md#email-object) y
  • una colección de identificadores o números para los mensajes que faltan, si los hay
| +|ids |Collection|->|Colección de ID de mensaje| +|startMsg|Integer|->|Número de secuencia del primer mensaje| +|endMsg |Integer|->|Número de secuencia del último mensaje| +|options|Object|->|Instrucciones de gestión de mensajes| +|Resultado|Object|<-|Object containing:
  • una colección de [objetos Email](EmailObjectClass.md#email-object) y
  • una colección de identificadores o números para los mensajes que faltan, si los hay
|
@@ -1149,11 +1149,11 @@ Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el esta
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|-> |Sequence number of the message| -|msgID|Text|-> |Unique ID of the message| -|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. Si es False el mensaje se deja intacto.| +|msgNumber|Integer|-> |Número de secuencia del mensaje| +|msgID|Text|-> |Identificación única del mensaje| +|updateSeen|Boolean|->|Si es True, el mensaje se marca como "visto" en el buzón. Si es False el mensaje se deja intacto.| |Resultado|BLOB|<-|Blob of the MIME string returned from the mail server|
@@ -1226,12 +1226,12 @@ El parámetro opcional *updateSeen* permite indicar si el mensaje está marcado
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|destinationBox|Text|->|Mailbox to receive moved messages| -|Result|Object|<-|Status of the move operation| +|msgsIDs|Collection|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|destinationBox|Text|->|Buzón para recibir los mensajes movidos| +|Resultado|Object|<-|Status of the move operation|
@@ -1330,11 +1330,11 @@ Para mover todos los mensajes del buzón actual:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |-----|--- |:---:|------| -|startMsg|Integer|-> |Sequence number of the first message| -|endMsg|Integer|->|Sequence number of the last message| -|Result|Collection|<-|Collection of unique IDs| +|startMsg|Integer|-> |Número de secuencia del primer mensaje| +|endMsg|Integer|->|Número de secuencia del último mensaje| +|Resultado|Collection||<-|Collection of unique IDs|
@@ -1394,17 +1394,17 @@ La función devuelve una colección de cadenas (IDs únicos).
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgIDs|any|->|Collection of strings: Message unique IDs (text)
Text: Unique ID of a message
Longint (IMAP all): All messages in the selected mailbox| -|keywords|Object|->|Keyword flags to remove| +|msgIDs|any|->|Colección de cadenas: Identificadores únicos de mensajes (texto)
Texto: ID único de un mensaje
Longint (IMAP all): todos los mensajes del buzón seleccionado| +|keywords|Object|->|Banderas de palabras clave a eliminar| |Result|Object|<-|Status of the removeFlags operation|
#### Descripción -The `.delete()` function sets the "deleted" flag for the messages defined in `msgsIDs` or `allMsgs`. +La función `.removeFlags()` elimina las banderas de los `msgIDs` para las `palabras clave` especificadas. En el parámetro `msgIDs`, puede pasar: @@ -1483,11 +1483,11 @@ $status:=$transporter.removeFlags(IMAP all;$flags)
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|currentName|Text|->|Name of the current mailbox| -|newName|Text|->|New mailbox name| -|Result|Object|<-|Status of the renaming operation| +|currentName|Text|->|Nombre del buzón actual| +|newName|Text|->|Nombre del nuevo buzón| +|Resultado|Object|<-|Status of the renaming operation|
@@ -1647,7 +1647,7 @@ Las claves de búsqueda pueden solicitar el valor a buscar: * **Marcadores**: los valores de tipo marcador (flags) aceptan una o varias palabras claves (incluyendo marcadores estándar) separados por espacios. Ejemplo: `searchCriteria = KEYWORD \Flagged \Draft` -* **Conjunto de mensajes**: identifica un conjunto de mensajes. En el caso de los números de secuencia de los mensajes, se trata de números consecutivos desde el 1 hasta el número total de mensajes en el buzón. Los números son separados por coma; un dos puntos (:) delimita entre dos números inclusive. Examples: `2,4:7,9,12:*` is `2,4,5,6,7,9,12,13,14,15` for a mailbox with 15 messages. `searchCriteria = 1:5 ANSWERED` busca en la selección de mensajes 1 a 5, los mensajes que tienen el marcador \Answered. `searchCriteria= 2,4 ANSWERED` busca en la selección de mensajes (números de mensaje 2 y 4) los mensajes que tienen el marcador \Answered. +* **Conjunto de mensajes**: identifica un conjunto de mensajes. En el caso de los números de secuencia de los mensajes, se trata de números consecutivos desde el 1 hasta el número total de mensajes en el buzón. Los números son separados por coma; un dos puntos (:) delimita entre dos números inclusive. Ejemplos: `2,4:7,9,12:*` es `2,4,5,6,7,9,12,13,14,15` para un buzón con 15 mensajes. `searchCriteria = 1:5 ANSWERED` busca en la selección de mensajes 1 a 5, los mensajes que tienen el marcador \Answered. `searchCriteria= 2,4 ANSWERED` busca en la selección de mensajes (números de mensaje 2 y 4) los mensajes que tienen el marcador \Answered. #### Teclas de búsqueda disponibles @@ -1706,11 +1706,11 @@ Las claves de búsqueda pueden solicitar el valor a buscar:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|name|Text|-> |Name of the mailbox| -|state|Integer|->|Mailbox access status| -|Result|Object|<-|boxInfo object| +|name|Text|-> |Nombre del buzón| +|state|Integer|->|Estado de acceso al buzón| +|Resultado|Object|<-|boxInfo object|
From 2c4f62cea618b482233737e1337eccf5cd70cce3 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:28 +0200 Subject: [PATCH 11/99] New translations mailattachmentclass.md (Spanish) --- .../version-19/API/MailAttachmentClass.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/MailAttachmentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/MailAttachmentClass.md index 9c5b9189cdf711..dbbaf5f9fdfa53 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/MailAttachmentClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/MailAttachmentClass.md @@ -27,14 +27,14 @@ Los objetos Attachment ofrecen las siguientes propiedades y funciones de sólo l
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|path|Text|->|Path of the attachment file| -|blob|Blob|->|BLOB containing the attachment| -|name|Text|->|Name + extension used by the mail client to designate the attachment| -|cid|Text|->|ID of attachment (HTML messages only), or " " if no cid is required| -|type|Text|->|Value of the content-type header| -|disposition|Text|->|Value of the content-disposition header: "inline" or "attachment".| +|path|Text|->|Ruta del archivo adjunto| +|blob|Blob|->|BLOB que contiene el adjunto| +|name|Text|->|Nombre + extensión utilizados por el cliente de correo para designar el adjunto| +|cid|Text|->|ID del adjunto (sólo mensajes HTML), o " " si no se requiere cid| +|type|Text|->|Valor del encabezado content-type| +|disposition|Text|->|Valor del encabezado content-disposition: "inline" o "attachment".| |Result|4D.MailAttachment|<-|Attachment object|
@@ -163,14 +163,14 @@ $transporter.send($email)
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|path|Text|->|Path of the attachment file| -|blob|Blob|->|BLOB containing the attachment| -|name|Text|->|Name + extension used by the mail client to designate the attachment| -|cid|Text|->|ID of attachment (HTML messages only), or " " if no cid is required| -|type|Text|->|Value of the content-type header| -|disposition|Text|->|Value of the content-disposition header: "inline" or "attachment".| +|path|Text|->|Ruta del archivo adjunto| +|blob|Blob|->|BLOB que contiene el adjunto| +|name|Text|->|Nombre + extensión utilizados por el cliente de correo para designar el adjunto| +|cid|Text|->|ID del adjunto (sólo mensajes HTML), o " " si no se requiere cid| +|type|Text|->|Valor del encabezado content-type| +|disposition|Text|->|Valor del encabezado content-disposition: "inline" o "attachment".| |Result|4D.MailAttachment|<-|Attachment object|
From 2ae2211b2e37f7937c7e026ed5b71d2092766ed1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:30 +0200 Subject: [PATCH 12/99] New translations pop3transporterclass.md (Spanish) --- .../version-19/API/POP3TransporterClass.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/POP3TransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/POP3TransporterClass.md index e2e8a3506501e6..b830d56b550e2f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/POP3TransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/POP3TransporterClass.md @@ -59,17 +59,17 @@ El comando `POP3 New transporter` ](#acceptunsecureconnection)    | False | -| .**accessTokenOAuth2**: Text Cadena que representa las credenciales de autorización OAuth 2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No devuelto en el objeto *[SMTP transporter](./SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](#connectiontimeout)    | 30 | -| [](#host)    | *mandatory* | -| [](#logfile)    | ninguno | -| **.password**: Text contraseña de usuario para la autenticación en el servidor. No devuelto en el objeto *[SMTP transporter](./SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | -| [](#port)    | 995 | -| [](#user)    | ninguno | +| *server* | Valor por defecto (si se omite) | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](#acceptunsecureconnection)    | False | +| .**accessTokenOAuth2**: Text Cadena que representa las credenciales de autorización OAuth 2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No devuelto en el objeto *[SMTP transporter](./SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | +| [](#authenticationmode)    | the most secure authentication mode supported by the server is used | +| [](#connectiontimeout)    | 30 | +| [](#host)    | *mandatory* | +| [](#logfile)    | ninguno | +| **.password**: Text contraseña de usuario para la autenticación en el servidor. No devuelto en el objeto *[SMTP transporter](./SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | +| [](#port)    | 995 | +| [](#user)    | ninguno | #### Resultado @@ -269,10 +269,10 @@ El objeto `boxInfo` devuelto contiene las siguientes propiedades:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|->|Number of the message in the list | -|Result|Object|<-|[Email object](EmailObjectClass.md#email-object)| +|msgNumber|Integer|->|Número del mensaje en la lista | +|Resultado|Objeto|<-|[Email object](EmailObjectClass.md#email-object)|
@@ -328,10 +328,10 @@ Quiere saber el remitente del primer correo del buzón:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|->|Number of the message in the list | -|Result|Object|<-|mailInfo object| +|msgNumber|Integer|->|Número del mensaje en la lista | +|Resultado|Objeto|<-|mailInfo object|
From 7a24a89383f4c2de1e9d9810f6f2fb17b970c01e Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:31 +0200 Subject: [PATCH 13/99] New translations smtptransporterclass.md (Spanish) --- .../version-19/API/SMTPTransporterClass.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SMTPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SMTPTransporterClass.md index 43e6dd9926b143..1f9e0321491178 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SMTPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SMTPTransporterClass.md @@ -68,7 +68,7 @@ En el parámetro *server*, pase un objeto que contenga las siguientes propiedade | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | | [](#acceptunsecureconnection)    | False | | .**accessTokenOAuth2**: cadena Text que representa las credenciales de autorización OAuth 2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). Cadena de texto u objeto token que representan las credenciales de autorización OAuth 2. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | +| [](#authenticationmode)    | el modo de autenticación más seguro se utiliza soportado por el servidor | | [](#bodycharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | | [](#connectiontimeout)    | 30 | | [](#headercharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | @@ -217,10 +217,10 @@ La conexión SMTP se cierra automáticamente:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|mail|Object|->|[Email](EmailObjectClass.md#email-object) to send| -|Result|Object|<-|SMTP status| +|mail|Object|->|[Email](EmailObjectClass.md#email-object) a enviar| +|Resultado|Object|<-|SMTP status|
From 988ebdc77bc716492264273ca208f41f29ded60b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:33 +0200 Subject: [PATCH 14/99] New translations sessionclass.md (Spanish) --- .../version-19/API/SessionClass.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md index ed9073398acce2..0de4bbeef9e5f7 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md @@ -283,11 +283,11 @@ End if
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|privilege|Text|->|Privilege name| -|privileges|Collection|->|Collection of privilege names| -|settings|Object|->|Object with a "privileges" property (string or collection)| +|privilege|Text|->|Nombre de privilegio| +|privileges|Collection|->|Colección de nombres de privilegio| +|settings|Object|->Objeto con una propiedad "privilegios" (cadena o colección)|
From bb9c35741792c669995fc23dc5adb86b43c401d1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:35 +0200 Subject: [PATCH 15/99] New translations signalclass.md (Spanish) --- .../version-19/API/SignalClass.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SignalClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SignalClass.md index ac962ae2cd2944..467f0c231c4426 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SignalClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SignalClass.md @@ -103,10 +103,10 @@ Método ***OpenForm***:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|description|Text|->|Description for the signal| -|Result|4D.Signal|<-|Native object encapsulating the signal| +|description|Text|->|Descripción de la señal| +|Resultado|4D.Señal|<-|Native object encapsulating the signal|
From e88fdc468279a83372deb135bc6a31a3b9e56196 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:52:38 +0200 Subject: [PATCH 16/99] New translations ziparchiveclass.md (Spanish) --- .../version-19/API/ZipArchiveClass.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/ZipArchiveClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/ZipArchiveClass.md index fd804d90948dd1..9ba3141af38033 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/ZipArchiveClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/ZipArchiveClass.md @@ -51,14 +51,14 @@ End if
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|fileToZip|4D.File|->|File or Folder object to compress| -|folderToZip|4D.Folder|->|File or Folder object to compress| -|zipStructure|Object|->|File or Folder object to compress| -|destinationFile|4D.File|->|Destination file for the archive| -|options|Integer|->|*folderToZip* option: `ZIP Without enclosing folder`| -|Result|Object|<-|Status object| +|fileToZip|4D.File|->|Objeto Archivo o Carpeta a comprimir| +|folderToZip|4D.Folder|->|Objeto Archivo o Carpeta a comprimir| +|zipStructure|Object|->|Objeto Archivo o Carpeta a comprimir| +|destinationFile|4D.File|->|Archivo de destino del archivo| +|options|Integer|->|Opción *folderToZip*: `ZIP Without enclosing folder`| +|Resultado|Object|<-|Status object|
@@ -76,7 +76,7 @@ Puede pasar un objeto 4D.File, 4D.Folder, o una estructura zip como primer pará | Propiedad | Tipo | Descripción | | ------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| compression | Integer |
  • `ZIP Compression standard`: Reducir la compresión (por defecto)
  • `ZIP Compression LZMA`: compresión LZMA
  • `ZIP Compression XZ`: compresión XZ
  • `ZIP Compression none`: sin compresión
  • | +| compression | Integer |
  • `ZIP Compression standard`: reducir la compresión (por defecto)
  • `ZIP Compression LZMA`: compresión LZMA
  • `ZIP Compression XZ`: compresión XZ
  • `ZIP Compression none`: sin compresión
  • | | level | Integer | Nivel de compresión. Valores posibles: 1 a 10. Un valor más bajo producirá un archivo más grande, mientras que un valor más alto producirá un archivo más pequeño. Sin embargo, el nivel de compresión influye en el rendimiento. Valores por defecto si se omiten:
  • `ZIP Compression standard`: 6
  • `ZIP Compression LZMA`: 4
  • `ZIP Compression XZ`: 4
  • | | encryption | Integer | La encriptación a utilizar si se define una contraseña:
  • `ZIP Encryption AES128`: encriptación AES con una llave de 128 bits.
  • `ZIP Encryption AES192`: encriptación AES con una llave de 192 bits.
  • `ZIP Encryption AES256`: encriptación AES con una llave de 256 bits (por defecto si se define la contraseña).
  • `ZIP Encryption none`: los datos no están encriptados (por defecto si no se define una contraseña)
  • | | contraseña | Text | Una contraseña a utilizar si se requiere encriptación. | @@ -190,11 +190,11 @@ Quiere pasar una colección de carpetas y archivos para comprimir al objeto *zip
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|zipFile|4D.File|->|Zip archive file| -|password|Text|->|ZIP archive password if any| -|Result|4D.ZipArchive|<-|Archive object| +|zipFile|4D.File|->|Archivo Zip| +|password|Text|->|Contraseña del archivo Zip si la hubiera| +|Resultado|4D.ZipArchive|<-|Archive object|
    From c5cb195c3b0289f46917a2998f348c38d83bf63e Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:56:21 +0200 Subject: [PATCH 17/99] New translations onafterkeystroke.md (Spanish) --- .../version-19/Events/onAfterKeystroke.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAfterKeystroke.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAfterKeystroke.md index 0d038670906466..b88a189f0ec628 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAfterKeystroke.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAfterKeystroke.md @@ -24,7 +24,7 @@ Después de que las propiedades de evento [`On Before Keystroke`](onBeforeKeystr El evento `On After Keystroke` no se genera: -- in [list box columns](FormObjects/listbox-column.md) method except when a cell is being edited (however it is generated in any cases in the [list box](FormObjects/listbox_overview.md) method), +- en el método [columnas de list box](FormObjects/listbox-column.md) excepto cuando se está editando una celda (sin embargo se genera en cualquier caso en el método [list box](FormObjects/listbox_overview.md)), - cuando las modificaciones usuario no se realizan con el teclado (pegar, arrastrar y soltar, casilla de verificación, lista desplegable, combo box). Para procesar estos eventos, debe utilizar [`On After Edit`](onAfterEdit.md). ### Secuencia de tecla From 5bb74756b6409c20a310f79bec47a1934dc5d54b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:56:23 +0200 Subject: [PATCH 18/99] New translations onalternativeclick.md (Spanish) --- .../version-19/Events/onAlternativeClick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAlternativeClick.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAlternativeClick.md index d6611c13d570fa..9135ba92eb4260 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAlternativeClick.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onAlternativeClick.md @@ -5,7 +5,7 @@ title: On Alternative Click | Code | Puede ser llamado por | Definición | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | -| 38 | [Button](FormObjects/button_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) |
  • Botones: el área "flecha" de un botón se presiona
  • List box: en una columna de un array, se hace clic en un botón de selección (atributo "alternateButton")
  • | +| 38 | [Botón](FormObjects/button_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna List Box](FormObjects/listbox-column.md) |
  • Botones: el área "flecha" de un botón se presiona
  • List box: en una columna de un array, se hace clic en un botón de selección (atributo "alternateButton")
  • | ## Descripción From 49f77747daeb856c01410339db3a4971e79e52c0 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:56:26 +0200 Subject: [PATCH 19/99] New translations onbeforekeystroke.md (Spanish) --- .../version-19/Events/onBeforeKeystroke.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onBeforeKeystroke.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onBeforeKeystroke.md index 6ab3bbc2d4cbe0..4e90d559582116 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onBeforeKeystroke.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onBeforeKeystroke.md @@ -22,7 +22,7 @@ Después de haber seleccionado los eventos `On Before Keystroke` y [`On After Ke El evento `On Before Keystroke` no se genera: -- in a [List Box Column](FormObjects/listbox-column.md) method except when a cell is being edited (however it is generated in any cases in the [list box](FormObjects/listbox_overview.md) method), +- en un método [columna List Box](FormObjects/listbox-column.md) excepto cuando se está editando una celda (sin embargo, se genera en cualquier caso en el método [List Box](FormObjects/listbox_overview.md)), - cuando las modificaciones usuario no se realizan con el teclado (pegar, arrastrar y soltar, casilla de verificación, lista desplegable, combo box). Para procesar estos eventos, debe utilizar [`On After Edit`](onAfterEdit.md). ### Objetos no editables From 7331b9f5b8e9f9eeda23d4fbcef92d417dd9b9cb Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:57:15 +0200 Subject: [PATCH 20/99] New translations oncolumnresize.md (Spanish) --- .../version-19/Events/onColumnResize.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onColumnResize.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onColumnResize.md index a53a4c9d5cfd91..dca5fda5b269f5 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onColumnResize.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onColumnResize.md @@ -3,9 +3,9 @@ id: onColumnResize title: On Column Resize --- -| Code | Puede ser llamado por | Definición | -| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| 33 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) | El ancho de una columna es modificado directamente por el usuario o en consecuencia de un redimensionamiento de la ventana del formulario | +| Code | Puede ser llamado por | Definición | +| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | +| 33 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box](FormObjects/listbox-column.md) | El ancho de una columna es modificado directamente por el usuario o en consecuencia de un redimensionamiento de la ventana del formulario | ## Descripción From ab63d1020258af765b038e03eb976111109cdac7 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:58:05 +0200 Subject: [PATCH 21/99] New translations onheaderclick.md (Spanish) --- .../version-19/Events/onHeaderClick.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onHeaderClick.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onHeaderClick.md index b6de29e4ec49b2..b45111bf16509e 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onHeaderClick.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onHeaderClick.md @@ -3,9 +3,9 @@ id: onHeaderClick title: On Header Click --- -| Code | Puede ser llamado por | Definición | -| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 42 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) | Se produce un clic en el encabezado de columna | +| Code | Puede ser llamado por | Definición | +| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- | +| 42 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box](FormObjects/listbox-column.md) | Se produce un clic en el encabezado de columna | ## Descripción From af551c5a148ad89074ad1a53ddcecbad51fa4f21 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:58:07 +0200 Subject: [PATCH 22/99] New translations onload.md (Spanish) --- .../version-19/Events/onLoad.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onLoad.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onLoad.md index 16c1fe5b8dcad8..a351a0f239f2b5 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onLoad.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onLoad.md @@ -3,9 +3,9 @@ id: onLoad title: On Load --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | -| 1 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [4D Write Pro area](FormObjects/writeProArea_overview.md) - [Button](FormObjects/button_overview.md) - [Button Grid](FormObjects/buttonGrid_overview.md) - [Check Box](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Dropdown list](FormObjects/dropdownList_Overview.md) - Form - [Hierarchical List](FormObjects/list_overview.md) - [Input](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) - [Picture Button](FormObjects/pictureButton_overview.md) - [Picture Pop up menu](FormObjects/picturePopupMenu_overview.md) - [Plug-in Area](FormObjects/pluginArea_overview.md) - [Progress Indicators](FormObjects/progressIndicator.md) - [Radio Button](FormObjects/radio_overview.md) - [Ruler](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subform](FormObjects/subform_overview.md) - [Tab control](FormObjects/tabControl.md) - [Web Area](FormObjects/webArea_overview.md) | El formulario está a punto de ser mostrado o impreso | +| Code | Puede ser llamado por | Definición | +| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| 1 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](FormObjects/writeProArea_overview.md) - [Botón](FormObjects/button_overview.md) - [Rejilla de botones](FormObjects/buttonGrid_overview.md) - [Casilla de selección](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Lista desplegable](FormObjects/dropdownList_Overview.md) - Formulario - [Lista jerárquica](FormObjects/list_overview.md) - [Entrada](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box ](FormObjects/listbox-column.md) - [Botón imagen](FormObjects/pictureButton_overview.md) - [Menú pop up imagen](FormObjects/picturePopupMenu_overview.md) - [Área de plug-in](FormObjects/pluginArea_overview.md) - [Indicador de progreso ](FormObjects/progressIndicator.md) - [Botón radio](FormObjects/radio_overview.md) - [Regla](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subformulario](FormObjects/subform_overview.md) - [Control de pestañas](FormObjects/tabControl.md) - [Área Web](FormObjects/webArea_overview.md) | El formulario está a punto de ser mostrado o impreso | ## Descripción From a439b55c00d4fcac3fff452ea054a00d03e432bd Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:59:38 +0200 Subject: [PATCH 23/99] New translations onrowmoved.md (Spanish) --- .../version-19/Events/onRowMoved.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onRowMoved.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onRowMoved.md index 6c7e4af8fa5ca4..539b7ce688f0f6 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onRowMoved.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onRowMoved.md @@ -3,9 +3,9 @@ id: onRowMoved title: On Row Moved --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -| 34 | [List Box of the array type](FormObjects/listbox_overview.md#array-list-boxes) - [List Box Column](FormObjects/listbox-column.md) | Una línea de list box es movida por el usuario por medio de arrastrar y soltar | +| Code | Puede ser llamado por | Definición | +| ---- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| 34 | [List Box de tipo array](FormObjects/listbox_overview.md#array-list-boxes) - [List Box Columna](FormObjects/listbox-column.md) | Una línea de list box es movida por el usuario por medio de arrastrar y soltar | ## Descripción From d7cc9e0e9799277b28899af8892e00b33c0bb587 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:59:43 +0200 Subject: [PATCH 24/99] New translations onunload.md (Spanish) --- .../version-19/Events/onUnload.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onUnload.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onUnload.md index dea1e96bb1a951..fde2d0a10b100f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onUnload.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onUnload.md @@ -3,9 +3,9 @@ id: onUnload title: On Unload --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| 24 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [4D Write Pro area](FormObjects/writeProArea_overview.md) - [Button](FormObjects/button_overview.md) - [Button Grid](FormObjects/buttonGrid_overview.md) - [Check Box](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Dropdown list](FormObjects/dropdownList_Overview.md) - Form - [Hierarchical List](FormObjects/list_overview.md) - [Input](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) - [Picture Button](FormObjects/pictureButton_overview.md) - [Picture Pop up menu](FormObjects/picturePopupMenu_overview.md) - [Plug-in Area](FormObjects/pluginArea_overview.md) - [Progress Indicators](FormObjects/progressIndicator.md) - [Radio Button](FormObjects/radio_overview.md) - [Ruler](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subform](FormObjects/subform_overview.md) - [Tab control](FormObjects/tabControl.md) - [Web Area](FormObjects/webArea_overview.md) | El formulario está a punto de salir y liberarse | +| Code | Puede ser llamado por | Definición | +| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| 24 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](FormObjects/writeProArea_overview.md) - [Botón](FormObjects/button_overview.md) - [Rejilla de botones](FormObjects/buttonGrid_overview.md) - [Casilla de selección](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Lista desplegable](FormObjects/dropdownList_Overview.md) - Formulario - [Lista jerárquica](FormObjects/list_overview.md) - [Entrada](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box ](FormObjects/listbox-column.md) - [Botón imagen](FormObjects/pictureButton_overview.md) - [Menú pop up imagen](FormObjects/picturePopupMenu_overview.md) - [Área de plug-in](FormObjects/pluginArea_overview.md) - [Indicador de progreso ](FormObjects/progressIndicator.md) - [Botón radio](FormObjects/radio_overview.md) - [Regla](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subformulario](FormObjects/subform_overview.md) - [Control de pestañas](FormObjects/tabControl.md) - [Área Web](FormObjects/webArea_overview.md) | El formulario está a punto de salir y liberarse | ## Descripción From 5a3a20afec5614fb97a71d774a35fc11991994da Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 01:59:48 +0200 Subject: [PATCH 25/99] New translations onvalidate.md (Spanish) --- .../version-19/Events/onValidate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onValidate.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onValidate.md index be10ac3ab75d4d..5a75184b752c45 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onValidate.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/onValidate.md @@ -10,7 +10,7 @@ title: On Validate ## Descripción -This event is triggered when the record data entry has been validated, for example after an `accept` [standard action](FormObjects/properties_Action.md#standard-action). +Este evento se activa cuando se ha validado la entrada de datos del registro, por ejemplo después de una [acción estándar ](FormObjects/properties_Action.md#standard-action) `accept`. ### Subformulario From 775e921c41b22ac87b1cb17eb2c139b3abdc678a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:00:52 +0200 Subject: [PATCH 26/99] New translations overview.md (Spanish) --- .../version-19/Events/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/overview.md index e5b0cce2fc56ba..c421ce75f67d63 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/Events/overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/Events/overview.md @@ -28,7 +28,7 @@ Cada evento es devuelto como un objeto por el comando `FORM Event`. Por defecto, Se devuelven propiedades adicionales cuando el evento se produce en objetos específicos. En particular: -- [list boxes](FormObjects/listbox-object.md#supported-form-events) and [list box columns](FormObjects/listbox-column.md#supported-form-events) return [additional properties](FormObjects/listbox-object.md#supported-form-events) such as `columnName` or `isRowSelected`. +- Los [list box](FormObjects/listbox-object.md#supported-form-events) y las [columnas de list box](FormObjects/listbox-column.md#supported-form-events) devuelven las [propiedades adicionales](FormObjects/listbox-object.md#supported-form-events) tales como `columnName` o `isRowSelected`. - Las [áreas de View Pro](FormObjects/viewProArea_overview.md) devuelven por ejemplo las propiedades `sheetName` o `action` en el objeto evento [On After Edit](onAfterEdit.md). From 4bbf3732c1a6694a495992120f8db60bf9d7e1bd Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:00:56 +0200 Subject: [PATCH 27/99] New translations formeditor.md (Spanish) --- .../version-19/FormEditor/formEditor.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/FormEditor/formEditor.md b/i18n/es/docusaurus-plugin-content-docs/version-19/FormEditor/formEditor.md index dd85d58a049e18..553a8e7a57d642 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/FormEditor/formEditor.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/FormEditor/formEditor.md @@ -56,7 +56,7 @@ La barra de herramientas contiene los siguientes elementos: | Icono | Nombre | Descripción | | ------------------------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ![](../assets/en/FormEditor/execute.png) | Ejecutar el formulario | Se utiliza para probar la ejecución del formulario. Al presionar este botón, 4D abre una nueva ventana y muestra el formulario en su contexto (lista de registros para un formulario lista y página de registro actual para un formulario detallado). El formulario se ejecuta en el proceso principal. | -| ![](../assets/en/FormEditor/selection.png) | [Herramienta de selección](#selecting-objects) | Allows selecting, moving and resizing form objects.
    **Note**: When an object of the Text or Group Box type is selected, pressing the **Enter** key lets you switch to editing mode. | +| ![](../assets/en/FormEditor/selection.png) | [Herramienta de selección](#selecting-objects) | Permite seleccionar, mover y cambiar el tamaño de los objetos del formulario.
    **Nota**: cuando se selecciona un objeto de tipo Texto o Área de Grupo, al presionar la tecla **Intro** se pasa al modo de edición. | | ![](../assets/en/FormEditor/zOrder.png) | [Orden de entrada](#data-entry-order) | Pasa al modo "Orden de entrada", donde es posible ver y cambiar el orden de entrada actual del formulario. Tenga en cuenta que las marcas permiten ver el orden de entrada actual, sin dejar de trabajar en el formulario. | | ![](../assets/en/FormEditor/moving.png) | [Desplazamiento](#moving-objects) | Pasa al modo " Desplazamiento ", en el que es posible llegar rápidamente a cualquier parte del formulario utilizando la función de arrastrar y soltar en la ventana. El cursor toma la forma de una mano. Este modo de navegación es especialmente útil cuando se hace zoom en el formulario. | | ![](../assets/en/FormEditor/zoom.png) | [Zoom](#zoom) | Permite modificar la escala de visualización del formulario (100% por defecto). Puede pasar al modo "Zoom" haciendo clic en la lupa o pulsando directamente en la barra correspondiente a la escala deseada. Esta función se detalla en la sección anterior. | @@ -235,12 +235,12 @@ La agrupación sólo afecta a los objetos en el editor de formularios. Cuando se Para agrupar los objetos: 1. Seleccione los objetos que desea agrupar. -2. Elija **Agrupar** en el menú Objetos. OR Click the Group button in the toolbar of the Form editor:
    ![](../assets/en/FormEditor/group.png) 4D marks the boundary of the newly grouped objects with handles. No hay marcas que delimiten ninguno de los objetos individuales del grupo. Ahora, al modificar el objeto agrupado, se modifican todos los objetos que componen el grupo. +2. Elija **Agrupar** en el menú Objetos. O Haga clic en el botón Agrupar en la barra de herramientas del editor de formularios:
    ![](../assets/en/FormEditor/group.png) 4D marca el límite de los objetos recién agrupados con manijas. No hay marcas que delimiten ninguno de los objetos individuales del grupo. Ahora, al modificar el objeto agrupado, se modifican todos los objetos que componen el grupo. Para desagrupar un grupo de objetos: 1. Seleccione el grupo de objetos que desea desagrupar. -2. Choose **Ungroup** from the **Object** menu.
    OR
    Click the **Ungroup** button (variant of the **Group** button) in the toolbar of the Form editor.
    If **Ungroup** is dimmed, this means that the selected object is already separated into its simplest form. 4D marca los bordes de los objetos individuales con marcas. +2. Seleccione **Desagrupar** en el menú **Objeto**.
    O
    Haga clic en el botón **Desagrupar** (variante del botón **Agrupar**) de la barra de herramientas del editor de formularios.
    Si **Desagrupar** aparece atenuado, significa que el objeto seleccionado ya está separado en su forma más simple. 4D marca los bordes de los objetos individuales con marcas. ### Alinear objetos @@ -304,7 +304,7 @@ Para repartir los objetos con igual espacio: 1. Seleccione tres o más objetos y haga clic en la herramienta Distribuir correspondiente. -2. In the toolbar, click on the distribution tool that corresponds to the distribution you want to apply.
    ![](../assets/en/FormEditor/distributionTool.png)
    OR
    Select a distribution menu command from the **Align** submenu in the **Object** menu or from the context menu of the editor. 4D distribuye los objetos consecuentemente. Los objetos se distribuyen utilizando la distancia a sus centros y se utiliza como referencia la mayor distancia entre dos objetos consecutivos. +2. En la barra de herramientas, haga clic en la herramienta de distribución correspondiente a la distribución que desee aplicar.
    ![](../assets/en/FormEditor/distributionTool.png)
    O
    Seleccione un comando de menú de distribución en el submenú **Alinear** del menú **Objeto** o en el menú contextual del editor. 4D distribuye los objetos consecuentemente. Los objetos se distribuyen utilizando la distancia a sus centros y se utiliza como referencia la mayor distancia entre dos objetos consecutivos. Para distribuir objetos utilizando la caja de diálogo Alinear y Distribuir: @@ -312,9 +312,9 @@ Para distribuir objetos utilizando la caja de diálogo Alinear y Distribuir: 2. Seleccione el comando **Alineación** del submenú **Alinear** del menú **Objeto** o del menú contextual del editor. Aparece la siguiente caja de diálogo:![](../assets/en/FormEditor/alignmentAssistant.png) -3. In the Left/Right Alignment and/or Top/Bottom Alignment areas, click the standard distribution icon: ![](../assets/en/FormEditor/horizontalDistribution.png)
    (Standard horizontal distribution icon)
    The example area displays the results of your selection. +3. En las áreas Alineación izquierda/derecha y/o Alineación superior/inferior, haga clic en el icono de distribución estándar: ![](../assets/en/FormEditor/horizontalDistribution.png)
    (Icono de distribución horizontal estándar)
    El área de ejemplo muestra los resultados de su selección. -4. To perform a distribution that uses the standard scheme, click **Preview** or *Apply*.
    In this case 4D will perform a standard distribution, so that the objects are set out with an equal amount of space between them.
    OR:
    To execute a specific distribution, select the **Distribute** option (for example if you want to distribute the objects based on the distance to their right side). Esta opción actúa como un interruptor. Si la casilla de selección Distribuir está seleccionada, los iconos situados debajo de ella realizan una función diferente:
    +4. Para realizar una distribución que utiliza el esquema estándar, haga clic en **Vista previa** o *Aplica*.
    En este caso, 4D realizará una distribución estándar para que los objetos estén espaciados de manera equitativa entre ellos.
    O:
    para ejecutar una distribución específica, seleccione la opción **Distribuir** (por ejemplo, si desea distribuir los objetos en función de la distancia a su lado derecho). Esta opción actúa como un interruptor. Si la casilla de selección Distribuir está seleccionada, los iconos situados debajo de ella realizan una función diferente:
    - Horizontalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los lados izquierdo, central (hor.) y derecho de los objetos seleccionados. - Verticalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los bordes superiores, centros (vert.) y bordes inferiores de los objetos seleccionados. @@ -378,7 +378,7 @@ Para ver o cambiar el orden de entrada: El puntero se convierte en un puntero de orden de entrada y 4D dibuja una línea en el formulario mostrando el orden en que selecciona los objetos durante la entrada de datos. Ver y cambiar el orden de entrada de datos son las únicas acciones que puede realizar hasta que haga clic en cualquier herramienta de la paleta Herramientas. -2. To change the data entry order, position the pointer on an object in the form and, while holding down the mouse button, drag the pointer to the object you want next in the data entry order.
    ![](../assets/en/FormEditor/entryOrder3.png)
    4D will adjust the entry order accordingly. +2. Para cambiar el orden de entrada de datos, ubique el puntero sobre un objeto del formulario y mientras mantiene presionado el botón del ratón, arrastre el puntero hasta el objeto que desee a continuación en el orden de entrada de datos.
    ![](../assets/en/FormEditor/entryOrder3.png)
    4D ajustará el orden de entrada en consecuencia. 3. Repita el paso 2 tantas veces como sea necesario para establecer el orden de entrada de datos que desee. From 9b17bd9c7ddfd7bf655cc27a2294baba489a50c1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:37:38 +0200 Subject: [PATCH 28/99] New translations webserverclass.md (Spanish) --- .../version-19/API/WebServerClass.md | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/WebServerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/WebServerClass.md index ac41782122b392..715fc81dfaa531 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/WebServerClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/WebServerClass.md @@ -73,10 +73,10 @@ Ofrecen las siguientes propiedades y funciones:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|----|---| -|option|Integer|->|Web server to get (default if omitted = `Web server database`)| -|Result|4D.WebServer|<-|Web server object| +|option|Integer|->|Servidor web a obtener (por defecto si se omite = `Web server database`)| +|Resultado|4D.WebServer|<-|Web server object|
    @@ -178,7 +178,7 @@ Camino de la carpeta donde **.characterSet** : Number
    **.characterSet** : Text -El conjunto de caracteres que el servidor web 4D debe utilizar para comunicarse con los navegadores conectados a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. Puede ser un entero MIBEnum o una cadena Name, identificadores [definidos por IANA](http://www.iana.org/assignments/character-sets/character-sets.xhtml). Aquí está la lista de identificadores correspondientes a los conjuntos de caracteres soportados por el servidor web 4D: +The conjunto de caracteres que el servidor web 4D debe utilizar para comunicarse con los navegadores conectados a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. Puede ser un entero MIBEnum o una cadena Name, identificadores [definidos por IANA](http://www.iana.org/assignments/character-sets/character-sets.xhtml). Aquí está la lista de identificadores correspondientes a los conjuntos de caracteres soportados por el servidor web 4D: - 4 = ISO-8859-1 - 12 = ISO-8859-9 @@ -203,7 +203,7 @@ El conjunto de caracteres que e **.cipherSuite** : Text -El lista de cifrado utilizada para el protocolo seguro. Define la prioridad de los algoritmos de cifrado implementados por el servidor web de 4D. Puede ser una secuencia de cadenas separadas por dos puntos (por ejemplo "ECDHE-RSA-AES128-..."). Ver la [página de cifrados](https://www.openssl.org/docs/manmaster/man1/ciphers.html) en el sitio OpenSSL. +The lista de cifrado utilizada para el protocolo seguro. Define la prioridad de los algoritmos de cifrado implementados por el servidor web de 4D. Puede ser una secuencia de cadenas separadas por dos puntos (por ejemplo "ECDHE-RSA-AES128-..."). Ver la [página de cifrados](https://www.openssl.org/docs/manmaster/man1/ciphers.html) en el sitio OpenSSL. @@ -214,7 +214,7 @@ El lista de cifrado utilizada pa **.CORSEnabled** : Boolean -El estado del servicio CORS (*Cross-origin resource sharing*) para el servidor web. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. Cuando está habilitado (True), las llamadas XHR (por ejemplo, peticiones REST) de páginas web fuera del dominio pueden ser permitidas en su aplicación (necesita definir la lista de direcciones permitidas en la lista de dominios CORS, ver `CORSSettings` abajo). Cuando se desactiva (False, por defecto), se ignoran todas las peticiones cruzadas enviadas con CORS. Cuando se activa (True) y un dominio o método no permitido envía una solicitud de sitio cruzado, se rechaza con una respuesta de error "403 - prohibido". +The estado del servicio CORS (*Cross-origin resource sharing*) para el servidor web. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. Cuando está habilitado (True), las llamadas XHR (por ejemplo, peticiones REST) de páginas web fuera del dominio pueden ser permitidas en su aplicación (necesita definir la lista de direcciones permitidas en la lista de dominios CORS, ver `CORSSettings` abajo). Cuando se desactiva (False, por defecto), se ignoran todas las peticiones cruzadas enviadas con CORS. Cuando se activa (True) y un dominio o método no permitido envía una solicitud de sitio cruzado, se rechaza con una respuesta de error "403 - prohibido". Por defecto: False (desactivado) @@ -255,7 +255,7 @@ Contiene el lista de hosts y m **.debugLog** : Number -El estado del archivo de log de las peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número del archivo). +The estado del archivo de log de las peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número del archivo). - 0 = desactivado - 1 = activado sin partes del cuerpo (en este caso se suministra el tamaño del cuerpo) @@ -272,7 +272,7 @@ El estado del archivo de log de las **.defaultHomepage** : Text -El nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada. +The nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada. @@ -283,7 +283,7 @@ El nombre de la página de i **.HSTSEnabled** : Boolean -El estado del HTTP Strict Transport Security (HSTS). HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. Los navegadores registrarán la información HSTS la primera vez que reciban una respuesta del servidor web, luego cualquier solicitud HTTP futura se transformará automáticamente en solicitudes HTTPS. El tiempo que esta información es almacenada por el navegador se especifica con la propiedad `HSTSMaxAge`. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales. +The estado del HTTP Strict Transport Security (HSTS). HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. Los navegadores registrarán la información HSTS la primera vez que reciban una respuesta del servidor web, luego cualquier solicitud HTTP futura se transformará automáticamente en solicitudes HTTPS. El tiempo que esta información es almacenada por el navegador se especifica con la propiedad `HSTSMaxAge`. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales. @@ -296,7 +296,7 @@ El estado del HTTP Strict Transp **.HSTSMaxAge** : Number -El duración máxima (en segundos) de activación de HSTS para cada nueva conexión cliente. Esta información se almacena del lado del cliente durante el tiempo especificado. +The duración máxima (en segundos) de activación de HSTS para cada nueva conexión cliente. Esta información se almacena del lado del cliente durante el tiempo especificado. Valor por defecto: 63072000 (2 años). @@ -309,7 +309,7 @@ Valor por defecto: 63072000 (2 años). **.HTTPCompressionLevel** : Number -El nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones clientes o respuestas servidor). Este selector permite optimizar los intercambios priorizando la velocidad de ejecución (menos compresión) o la cantidad de compresión (menos velocidad). +The nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones clientes o respuestas servidor). Este selector permite optimizar los intercambios priorizando la velocidad de ejecución (menos compresión) o la cantidad de compresión (menos velocidad). Valores posibles: @@ -327,7 +327,7 @@ Valores posibles: **.HTTPCompressionThreshold** : Number -El umbral de tamaño (bytes) de las peticiones por debajo del cual no se deben comprimir los intercambios. Este parámetro es útil para evitar la pérdida de tiempo de la máquina al comprimir los intercambios pequeños. +The umbral de tamaño (bytes) de las peticiones por debajo del cual no se deben comprimir los intercambios. Este parámetro es útil para evitar la pérdida de tiempo de la máquina al comprimir los intercambios pequeños. Umbral de compresión por defecto = 1024 bytes @@ -340,7 +340,7 @@ Umbral de compresión por defecto = 1024 bytes **.HTTPEnabled** : Boolean -El estado del protocolo HTTP. +The estado del protocolo HTTP. @@ -351,7 +351,7 @@ El estado del protocolo HTTP**.HTTPPort** : Number -El número de puerto IP de escucha para HTTP. +The número de puerto IP de escucha para HTTP. Por defecto = 80 @@ -364,7 +364,7 @@ Por defecto = 80 **.HTTPTrace** : Boolean -El activación de `HTTP TRACE`. Por razones de seguridad, por defecto el servidor web rechaza las peticiones `HTTP TRACE` con un error 405. Cuando se activa, el servidor web responde a las peticiones `HTTP TRACE` con la línea de petición, el encabezado y el cuerpo. +The activación de `HTTP TRACE`. Por razones de seguridad, por defecto el servidor web rechaza las peticiones `HTTP TRACE` con un error 405. Cuando se activa, el servidor web responde a las peticiones `HTTP TRACE` con la línea de petición, el encabezado y el cuerpo. @@ -375,7 +375,7 @@ El activación de `HTTP TRACE`**.HTTPSEnabled** : Boolean -El estado del protocolo HTTPS. +The estado del protocolo HTTPS. @@ -386,7 +386,7 @@ El estado del protocolo HTTPS**.HTTPSPort** : Number -El número de puerto IP de escucha para HTTPS. +The número de puerto IP de escucha para HTTPS. Por defecto = 443 @@ -400,7 +400,7 @@ Por defecto = 443 > Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession). -El duración de vida (en minutos) de los procesos de sesión legacy inactivos. Al final del tiempo de espera, el proceso se mata en el servidor, se llama al método base `On Web Legacy Close Session` y se destruye el contexto de la sesión heredada. +The duración de vida (en minutos) de los procesos de sesión legacy inactivos. Al final del tiempo de espera, el proceso se mata en el servidor, se llama al método base `On Web Legacy Close Session` y se destruye el contexto de la sesión heredada. Por defecto = 480 minutos @@ -414,7 +414,7 @@ Por defecto = 480 minutos > Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession). -El duración de vida (en minutos) de las sesiones legacy inactivas (duración definida en la cookie). Al final de este periodo, la cookie de sesión expira y deja de ser enviada por el cliente HTTP. +The duración de vida (en minutos) de las sesiones legacy inactivas (duración definida en la cookie). Al final de este periodo, la cookie de sesión expira y deja de ser enviada por el cliente HTTP. Por defecto = 480 minutos @@ -427,7 +427,7 @@ Por defecto = 480 minutos **.IPAddressToListen** : Text -El Dirección IP en la que el servidor web 4D recibirá las peticiones HTTP. Por defecto, no se define ninguna dirección específica. Se soportan tanto los formatos de cadena IPv6 como los IPv4. +The Dirección IP en la que el servidor web 4D recibirá las peticiones HTTP. Por defecto, no se define ninguna dirección específica. Se soportan tanto los formatos de cadena IPv6 como los IPv4. @@ -440,7 +440,7 @@ El Dirección IP en la que *Propiedad de sólo lectura* -El estado de ejecución del servidor web. +The estado de ejecución del servidor web. @@ -466,7 +466,7 @@ Contiene `True` si las sesiones **.logRecording** : Number -El valor de registro del log de peticiones (logweb.txt). +The valor de registro del log de peticiones (logweb.txt). - 0 = No registrar (por defecto) - 1 = Registro en formato CLF @@ -483,7 +483,7 @@ El valor de registro del log de **.maxConcurrentProcesses** : Number -El número máximo de procesos web simultáneos soportados por el servidor web. Cuando se alcance este número (menos uno), 4D no creará ningún otro proceso y devolverá el estado HTTP 503 - Servicio no disponible a todas las nuevas peticiones. +The número máximo de procesos web simultáneos soportados por el servidor web. Cuando se alcance este número (menos uno), 4D no creará ningún otro proceso y devolverá el estado HTTP 503 - Servicio no disponible a todas las nuevas peticiones. Valores posibles: 500000 - 2147483647 @@ -523,7 +523,7 @@ Contiene el número máximo de s **.minTLSVersion** : Number -El versión mínima de TLS aceptada para las conexiones. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. +La versión mínima de TLS aceptada para las conexiones. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. Valores posibles: @@ -558,7 +558,7 @@ El nombre de la aplicación del servido *Propiedad de sólo lectura* -El versión de la librería OpenSSL utilizada. +La versión de la librería OpenSSL utilizada. @@ -571,7 +571,7 @@ El versión de la librería O *Propiedad de sólo lectura* -El disponibilidad de PFS en el servidor. +La disponibilidad de PFS en el servidor. @@ -581,7 +581,7 @@ El disponibilidad de P **.rootFolder** : Text -El ruta de la carpeta raíz del servidor web. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings`, puede ser un objeto `Folder`. +La ruta de la carpeta raíz del servidor web. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings`, puede ser un objeto `Folder`. @@ -605,7 +605,7 @@ Contiene `True` si las sesio **.sessionCookieDomain** : Text -El campo "domain" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/*.4d.fr" para este selector, el cliente sólo enviará una cookie cuando la solicitud se dirija al dominio ".4d.fr", lo que excluye a los servidores que alojan datos estáticos externos. +The campo "domain" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/*.4d.fr" para este selector, el cliente sólo enviará una cookie cuando la solicitud se dirija al dominio ".4d.fr", lo que excluye a los servidores que alojan datos estáticos externos. @@ -616,7 +616,7 @@ El campo "domain" de la **.sessionCookieName** : Text -El nombre de la cookie utilizada para almacenar el ID de sesión. +The nombre de la cookie utilizada para almacenar el ID de sesión. *Propiedad de sólo lectura* @@ -629,7 +629,7 @@ El nombre de la cookie uti **.sessionCookiePath** : Text -El campo "path" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/4DACTION" para este selector, el cliente sólo enviará una cookie para las peticiones dinámicas que empiecen por 4DACTION, y no para las imágenes, páginas estáticas, etc. +The campo "path" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/4DACTION" para este selector, el cliente sólo enviará una cookie para las peticiones dinámicas que empiecen por 4DACTION, y no para las imágenes, páginas estáticas, etc. @@ -648,7 +648,7 @@ El campo "path" de la cook **.sessionCookieSameSite** : Text -El valor de la cookie de session "SameSite". Valores posibles (utilizando constantes): +The valor de la cookie de session "SameSite". Valores posibles (utilizando constantes): | Constante | Valor | Descripción | | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -669,7 +669,7 @@ Ver la descripción de [Session Cookie SameSite](WebServer/webServerConfig.md#se > Esta propiedad no se utiliza en el modo [sesiones escalables](#scalablesession) (no hay validación de la dirección IP). -El validación de la dirección IP para las cookies de sesión. Por razones de seguridad, por defecto el servidor web comprueba la dirección IP de cada solicitud que contiene una cookie de sesión y la rechaza si esta dirección no coincide con la dirección IP utilizada para crear la cookie. En algunas aplicaciones específicas, es posible que desee desactivar esta validación y aceptar las cookies de sesión, incluso cuando sus direcciones IP no coinciden. Por ejemplo, cuando los dispositivos móviles cambian entre las redes WiFi y 3G/4G, su dirección IP cambiará. En este caso, puede permitir que los clientes puedan seguir utilizando sus sesiones web incluso cuando las direcciones IP cambien (esta configuración reduce el nivel de seguridad de su aplicación). +The validación de la dirección IP para las cookies de sesión. Por razones de seguridad, por defecto el servidor web comprueba la dirección IP de cada solicitud que contiene una cookie de sesión y la rechaza si esta dirección no coincide con la dirección IP utilizada para crear la cookie. En algunas aplicaciones específicas, es posible que desee desactivar esta validación y aceptar las cookies de sesión, incluso cuando sus direcciones IP no coinciden. Por ejemplo, cuando los dispositivos móviles cambian entre las redes WiFi y 3G/4G, su dirección IP cambiará. En este caso, puede permitir que los clientes puedan seguir utilizando sus sesiones web incluso cuando las direcciones IP cambien (esta configuración reduce el nivel de seguridad de su aplicación). @@ -691,10 +691,10 @@ El validación de
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|----|---| -|settings|Object|->|Web server settings to set at startup| -|Result|Object|<-|Status of the web server startup| +|settings|Object|->|Configuración del servidor web para establecer al inicio| +|Resultado|Object|<-|Status of the web server startup|
    From 540180c3acf63344cd25626a37603e98735d0f8e Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:39:44 +0200 Subject: [PATCH 29/99] New translations imaptransporterclass.md (Spanish) --- .../version-20/API/IMAPTransporterClass.md | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md index 6d20cd06f10a24..282930daf2004f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md @@ -72,18 +72,18 @@ El comando `IMAP New transporter` ](#acceptunsecureconnection)    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](#checkconnectiondelay)    | 300 | -| [](#connectiontimeout)    | 30 | -| [](#host)    | *mandatory* | -| [](#logfile)    | ninguno | -| .**password**: Text
    Contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | -| [](#port)    | 993 | -| [](#user)    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](#acceptunsecureconnection)    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | +| [](#authenticationmode)    | the most secure authentication mode supported by the server is used | +| [](#checkconnectiondelay)    | 300 | +| [](#connectiontimeout)    | 30 | +| [](#host)    | *mandatory* | +| [](#logfile)    | ninguno | +| .**password**: Text
    Contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](#imap-transporter-object)*. | ninguno | +| [](#port)    | 993 | +| [](#user)    | ninguno | > **Atención**: asegúrese de que el tiempo de espera definido sea menor que el tiempo de espera del servidor, de lo contrario el tiempo de espera del cliente será inútil. #### Resultado @@ -356,12 +356,12 @@ La propiedad `.checkConnectionDelay` contiene
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|destinationBox|Text|->|Mailbox to receive copied messages| -|Result|Object|<-|Status of the copy operation| +|msgsIDs|Collection|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|destinationBox|Text|->|Buzón para recibir los mensajes copiados| +|Resultado|Object|<-|Status of the copy operation|
    @@ -540,11 +540,11 @@ End for each
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|Result|Object|<-|Status of the delete operation| +|msgsIDs|Colección|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|Resultado|Object|<-|Status of the delete operation|
    @@ -974,12 +974,12 @@ Caracter delimitador del nombre del buzón.
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|->|Sequence number of the message| -|msgID|Text|->|Unique ID of the message| -|options|Object|->|Message handling instructions| -|Result|Object|<-|[Email object](EmailObjectClass.md#email-object)| +|msgNumber|Integer|->|Número de secuencia del mensaje| +|msgID|Text|->|Identificación única del mensaje| +|options|Object|->|Instrucciones de gestión del mensaje| +|Resultado|Object|<-|[Email object](EmailObjectClass.md#email-object)|
    @@ -1050,13 +1050,13 @@ Quiere obtener el mensaje con ID = 1:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|ids |Collection|->|Collection of message ID| -|startMsg|Integer|->|Sequence number of the first message| -|endMsg |Integer|->|Sequence number of the last message| -|options|Object|->|Message handling instructions| -|Result|Object|<-|Object containing:
    • una colección de [objetos Email](EmailObjectClass.md#email-object) y
    • una colección de identificadores o números para los mensajes que faltan, si los hay
    | +|ids |Collection|->|Colección de ID de mensaje| +|startMsg|Integer|->|Número de secuencia del primer mensaje| +|endMsg |Integer|->|Número de secuencia del último mensaje| +|options|Object|->|Instrucciones de gestión de mensajes| +|Resultado|Object|<-|Object containing:
    • una colección de [objetos Email](EmailObjectClass.md#email-object) y
    • una colección de identificadores o números para los mensajes que faltan, si los hay
    |
    @@ -1153,11 +1153,11 @@ Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el esta
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|-> |Sequence number of the message| -|msgID|Text|-> |Unique ID of the message| -|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. Si es False el mensaje se deja intacto.| +|msgNumber|Integer|-> |Número de secuencia del mensaje| +|msgID|Text|-> |Identificación única del mensaje| +|updateSeen|Boolean|->|Si es True, el mensaje se marca como "visto" en el buzón. Si es False el mensaje se deja intacto.| |Resultado|BLOB|<-|Blob of the MIME string returned from the mail server|
    @@ -1230,12 +1230,12 @@ El parámetro opcional *updateSeen* permite indicar si el mensaje está marcado
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgsIDs|Collection|->|Collection of message unique IDs (strings)| -|allMsgs|Integer|->|`IMAP all`: All messages in the selected mailbox| -|destinationBox|Text|->|Mailbox to receive moved messages| -|Result|Object|<-|Status of the move operation| +|msgsIDs|Collection|->|Colección de IDs únicos de mensajes (cadenas)| +|allMsgs|Integer|->|`IMAP all`: todos los mensajes del buzón seleccionado| +|destinationBox|Text|->|Buzón para recibir los mensajes movidos| +|Resultado|Object|<-|Status of the move operation|
    @@ -1334,11 +1334,11 @@ Para mover todos los mensajes del buzón actual:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |-----|--- |:---:|------| -|startMsg|Integer|-> |Sequence number of the first message| -|endMsg|Integer|->|Sequence number of the last message| -|Result|Collection|<-|Collection of unique IDs| +|startMsg|Integer|-> |Número de secuencia del primer mensaje| +|endMsg|Integer|->|Número de secuencia del último mensaje| +|Resultado|Collection||<-|Collection of unique IDs|
    @@ -1400,17 +1400,17 @@ La función devuelve una colección de cadenas (IDs únicos).
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgIDs|any|->|Collection of strings: Message unique IDs (text)
    Text: Unique ID of a message
    Longint (IMAP all): All messages in the selected mailbox| -|keywords|Object|->|Keyword flags to remove| +|msgIDs|any|->|Colección de cadenas: Identificadores únicos de mensajes (texto)
    Texto: ID único de un mensaje
    Longint (IMAP all): todos los mensajes del buzón seleccionado| +|keywords|Object|->|Banderas de palabras clave a eliminar| |Result|Object|<-|Status of the removeFlags operation|
    #### Descripción -The `.delete()` function sets the "deleted" flag for the messages defined in `msgsIDs` or `allMsgs`. +La función `.removeFlags()` elimina las banderas de los `msgIDs` para las `palabras clave` especificadas. En el parámetro `msgIDs`, puede pasar: @@ -1491,11 +1491,11 @@ $status:=$transporter.removeFlags(IMAP all;$flags)
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|currentName|Text|->|Name of the current mailbox| -|newName|Text|->|New mailbox name| -|Result|Object|<-|Status of the renaming operation| +|currentName|Text|->|Nombre del buzón actual| +|newName|Text|->|Nombre del nuevo buzón| +|Resultado|Object|<-|Status of the renaming operation|
    @@ -1655,7 +1655,7 @@ Las claves de búsqueda pueden solicitar el valor a buscar: * **Marcadores**: los valores de tipo marcador (flags) aceptan una o varias palabras claves (incluyendo marcadores estándar) separados por espacios. Ejemplo: `searchCriteria = KEYWORD \Flagged \Draft` -* **Conjunto de mensajes**: identifica un conjunto de mensajes. En el caso de los números de secuencia de los mensajes, se trata de números consecutivos desde el 1 hasta el número total de mensajes en el buzón. Los números son separados por coma; un dos puntos (:) delimita entre dos números inclusive. Examples: `2,4:7,9,12:*` is `2,4,5,6,7,9,12,13,14,15` for a mailbox with 15 messages. `searchCriteria = 1:5 ANSWERED` busca en la selección de mensajes 1 a 5, los mensajes que tienen el marcador \Answered. `searchCriteria= 2,4 ANSWERED` busca en la selección de mensajes (números de mensaje 2 y 4) los mensajes que tienen el marcador \Answered. +* **Conjunto de mensajes**: identifica un conjunto de mensajes. En el caso de los números de secuencia de los mensajes, se trata de números consecutivos desde el 1 hasta el número total de mensajes en el buzón. Los números son separados por coma; un dos puntos (:) delimita entre dos números inclusive. Ejemplos: `2,4:7,9,12:*` es `2,4,5,6,7,9,12,13,14,15` para un buzón con 15 mensajes. `searchCriteria = 1:5 ANSWERED` busca en la selección de mensajes 1 a 5, los mensajes que tienen el marcador \Answered. `searchCriteria= 2,4 ANSWERED` busca en la selección de mensajes (números de mensaje 2 y 4) los mensajes que tienen el marcador \Answered. #### Teclas de búsqueda disponibles @@ -1716,11 +1716,11 @@ Las claves de búsqueda pueden solicitar el valor a buscar:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|name|Text|-> |Name of the mailbox| -|state|Integer|->|Mailbox access status| -|Result|Object|<-|boxInfo object| +|name|Text|-> |Nombre del buzón| +|state|Integer|->|Estado de acceso al buzón| +|Resultado|Object|<-|boxInfo object|
    From 33ca9cb1710cba55c22d7dc99a2bc119126c4f41 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:39:47 +0200 Subject: [PATCH 30/99] New translations pop3transporterclass.md (Spanish) --- .../version-20/API/POP3TransporterClass.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/POP3TransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/POP3TransporterClass.md index ab9e5b49356db0..e5341f75a88e9a 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/POP3TransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/POP3TransporterClass.md @@ -60,17 +60,17 @@ El comando `POP3 New transporter` ](#acceptunsecureconnection)    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No devuelto en el objeto *[POP3 transporter](#pop3-transporter-object)*. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](#connectiontimeout)    | 30 | -| [](#host)    | *mandatory* | -| [](#logfile)    | ninguno | -| **.password**: Text
    Contraseña de usuario para la autenticación en el servidor. No devuelto en el objeto *[POP3 transporter](#pop3-transporter-object)*. | ninguno | -| [](#port)    | 995 | -| [](#user)    | ninguno | +| *server* | Valor por defecto (si se omite) | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](#acceptunsecureconnection)    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No devuelto en el objeto *[POP3 transporter](#pop3-transporter-object)*. | ninguno | +| [](#authenticationmode)    | the most secure authentication mode supported by the server is used | +| [](#connectiontimeout)    | 30 | +| [](#host)    | *mandatory* | +| [](#logfile)    | ninguno | +| **.password**: Text
    Contraseña de usuario para la autenticación en el servidor. No devuelto en el objeto *[POP3 transporter](#pop3-transporter-object)*. | ninguno | +| [](#port)    | 995 | +| [](#user)    | ninguno | #### Resultado @@ -341,10 +341,10 @@ Quiere saber el remitente del primer correo del buzón:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|msgNumber|Integer|->|Number of the message in the list | -|Result|Object|<-|mailInfo object| +|msgNumber|Integer|->|Número del mensaje en la lista | +|Resultado|Objeto|<-|mailInfo object|
    From c2fe032ad23474d71440bbd1c98052a05eb189e7 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:39:49 +0200 Subject: [PATCH 31/99] New translations smtptransporterclass.md (Spanish) --- .../version-20/API/SMTPTransporterClass.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SMTPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SMTPTransporterClass.md index cb77d66dfe8333..a7e46cfef089cb 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SMTPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SMTPTransporterClass.md @@ -64,21 +64,21 @@ El comando `SMTP New transporter` ](#acceptunsecureconnection)    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). Cadena de texto u objeto token que representan las credenciales de autorización OAuth 2. | ninguno | -| [](#authenticationmode)    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](#bodycharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | -| [](#connectiontimeout)    | 30 | -| [](#headercharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | -| [](#host)    | *mandatory* | -| [](#keepalive)    | True | -| [](#logfile)    | ninguno | -| **password**: Text
    Contraseña usuario para la autenticación en el servidor. Cadena de texto u objeto token que representan las credenciales de autorización OAuth 2. | ninguno | -| [](#port)    | 587 | -| [](#sendtimeout)    | 100 | -| [](#user)    | ninguno | +| *server* | Valor por defecto (si se omite) | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](#acceptunsecureconnection)    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena de texto u objeto token que representa las credenciales de autorización OAuth2. Sólo se utiliza con OAUTH2 `authenticationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). Cadena de texto u objeto token que representan las credenciales de autorización OAuth 2. | ninguno | +| [](#authenticationmode)    | the most secure authentication mode supported by the server is used | +| [](#bodycharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | +| [](#connectiontimeout)    | 30 | +| [](#headercharset)    | `mail mode UTF8` (US-ASCII_UTF8_QP) | +| [](#host)    | *mandatory* | +| [](#keepalive)    | True | +| [](#logfile)    | ninguno | +| **password**: Text
    Contraseña usuario para la autenticación en el servidor. Cadena de texto u objeto token que representan las credenciales de autorización OAuth 2. | ninguno | +| [](#port)    | 587 | +| [](#sendtimeout)    | 100 | +| [](#user)    | ninguno | #### Resultado @@ -217,10 +217,10 @@ La conexión SMTP se cierra automáticamente:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|mail|Object|->|[Email](EmailObjectClass.md#email-object) to send| -|Result|Object|<-|SMTP status| +|mail|Object|->|[Email](EmailObjectClass.md#email-object) a enviar| +|Resultado|Object|<-|SMTP status|
    From 3a4ebed19809103383e4acf8879d284ddb808529 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:39:50 +0200 Subject: [PATCH 32/99] New translations sessionclass.md (Spanish) --- .../version-20/API/SessionClass.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md index 0ebb70a0017174..5416d01611ca2f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md @@ -307,11 +307,11 @@ End if
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|privilege|Text|->|Privilege name| -|privileges|Collection|->|Collection of privilege names| -|settings|Object|->|Object with a "privileges" property (string or collection)| +|privilege|Text|->|Nombre de privilegio| +|privileges|Collection|->|Colección de nombres de privilegio| +|settings|Object|->Objeto con una propiedad "privilegios" (cadena o colección)|
    From ade498b122bfe1752ab3666d4c312e7b37f5d2ea Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:39:52 +0200 Subject: [PATCH 33/99] New translations signalclass.md (Spanish) --- .../version-20/API/SignalClass.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SignalClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SignalClass.md index 398a9118ad1b71..d3af628bda723b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SignalClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SignalClass.md @@ -111,10 +111,10 @@ Método ***OpenForm***:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|description|Text|->|Description for the signal| -|Result|4D.Signal|<-|Native object encapsulating the signal| +|description|Text|->|Descripción de la señal| +|Resultado|4D.Señal|<-|Native object encapsulating the signal|
    From da9343923c31ca21f49c58f8f579a5bf38d893c9 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:40:40 +0200 Subject: [PATCH 34/99] New translations webserverclass.md (Spanish) --- .../version-20/API/WebServerClass.md | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/WebServerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/WebServerClass.md index aa9bfd85671336..5423d93287e06b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/WebServerClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/WebServerClass.md @@ -73,10 +73,10 @@ Ofrecen las siguientes propiedades y funciones:
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|----|---| -|option|Integer|->|Web server to get (default if omitted = `Web server database`)| -|Result|4D.WebServer|<-|Web server object| +|option|Integer|->|Servidor web a obtener (por defecto si se omite = `Web server database`)| +|Resultado|4D.WebServer|<-|Web server object|
    @@ -178,7 +178,7 @@ Camino de la carpeta donde **.characterSet** : Number
    **.characterSet** : Text -El conjunto de caracteres que el servidor web 4D debe utilizar para comunicarse con los navegadores conectados a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. Puede ser un entero MIBEnum o una cadena Name, identificadores [definidos por IANA](http://www.iana.org/assignments/character-sets/character-sets.xhtml). Aquí está la lista de identificadores correspondientes a los conjuntos de caracteres soportados por el servidor web 4D: +The conjunto de caracteres que el servidor web 4D debe utilizar para comunicarse con los navegadores conectados a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. Puede ser un entero MIBEnum o una cadena Name, identificadores [definidos por IANA](http://www.iana.org/assignments/character-sets/character-sets.xhtml). Aquí está la lista de identificadores correspondientes a los conjuntos de caracteres soportados por el servidor web 4D: - 4 = ISO-8859-1 - 12 = ISO-8859-9 @@ -203,7 +203,7 @@ El conjunto de caracteres que e **.cipherSuite** : Text -El lista de cifrado utilizada para el protocolo seguro. Define la prioridad de los algoritmos de cifrado implementados por el servidor web de 4D. Puede ser una secuencia de cadenas separadas por dos puntos (por ejemplo "ECDHE-RSA-AES128-..."). Ver la [página de cifrados](https://www.openssl.org/docs/manmaster/man1/ciphers.html) en el sitio OpenSSL. +The lista de cifrado utilizada para el protocolo seguro. Define la prioridad de los algoritmos de cifrado implementados por el servidor web de 4D. Puede ser una secuencia de cadenas separadas por dos puntos (por ejemplo "ECDHE-RSA-AES128-..."). Ver la [página de cifrados](https://www.openssl.org/docs/manmaster/man1/ciphers.html) en el sitio OpenSSL. @@ -214,7 +214,7 @@ El lista de cifrado utilizada pa **.CORSEnabled** : Boolean -El estado del servicio CORS (*Cross-origin resource sharing*) para el servidor web. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. Cuando está habilitado (True), las llamadas XHR (por ejemplo, peticiones REST) de páginas web fuera del dominio pueden ser permitidas en su aplicación (necesita definir la lista de direcciones permitidas en la lista de dominios CORS, ver `CORSSettings` abajo). Cuando se desactiva (False, por defecto), se ignoran todas las peticiones cruzadas enviadas con CORS. Cuando se activa (True) y un dominio o método no permitido envía una solicitud de sitio cruzado, se rechaza con una respuesta de error "403 - prohibido". +The estado del servicio CORS (*Cross-origin resource sharing*) para el servidor web. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. Cuando está habilitado (True), las llamadas XHR (por ejemplo, peticiones REST) de páginas web fuera del dominio pueden ser permitidas en su aplicación (necesita definir la lista de direcciones permitidas en la lista de dominios CORS, ver `CORSSettings` abajo). Cuando se desactiva (False, por defecto), se ignoran todas las peticiones cruzadas enviadas con CORS. Cuando se activa (True) y un dominio o método no permitido envía una solicitud de sitio cruzado, se rechaza con una respuesta de error "403 - prohibido". Por defecto: False (desactivado) @@ -255,7 +255,7 @@ Contiene el lista de hosts y m **.debugLog** : Number -El estado del archivo de log de las peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número del archivo). +The estado del archivo de log de las peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número del archivo). - 0 = desactivado - 1 = activado sin partes del cuerpo (en este caso se suministra el tamaño del cuerpo) @@ -272,7 +272,7 @@ El estado del archivo de log de las **.defaultHomepage** : Text -El nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada. +The nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada. @@ -283,7 +283,7 @@ El nombre de la página de i **.HSTSEnabled** : Boolean -El estado del HTTP Strict Transport Security (HSTS). HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. Los navegadores registrarán la información HSTS la primera vez que reciban una respuesta del servidor web, luego cualquier solicitud HTTP futura se transformará automáticamente en solicitudes HTTPS. El tiempo que esta información es almacenada por el navegador se especifica con la propiedad `HSTSMaxAge`. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales. +The estado del HTTP Strict Transport Security (HSTS). HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. Los navegadores registrarán la información HSTS la primera vez que reciban una respuesta del servidor web, luego cualquier solicitud HTTP futura se transformará automáticamente en solicitudes HTTPS. El tiempo que esta información es almacenada por el navegador se especifica con la propiedad `HSTSMaxAge`. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales. @@ -296,7 +296,7 @@ El estado del HTTP Strict Transp **.HSTSMaxAge** : Number -El duración máxima (en segundos) de activación de HSTS para cada nueva conexión cliente. Esta información se almacena del lado del cliente durante el tiempo especificado. +The duración máxima (en segundos) de activación de HSTS para cada nueva conexión cliente. Esta información se almacena del lado del cliente durante el tiempo especificado. Valor por defecto: 63072000 (2 años). @@ -309,7 +309,7 @@ Valor por defecto: 63072000 (2 años). **.HTTPCompressionLevel** : Number -El nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones clientes o respuestas servidor). Este selector permite optimizar los intercambios priorizando la velocidad de ejecución (menos compresión) o la cantidad de compresión (menos velocidad). +The nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones clientes o respuestas servidor). Este selector permite optimizar los intercambios priorizando la velocidad de ejecución (menos compresión) o la cantidad de compresión (menos velocidad). Valores posibles: @@ -327,7 +327,7 @@ Valores posibles: **.HTTPCompressionThreshold** : Number -El umbral de tamaño (bytes) de las peticiones por debajo del cual no se deben comprimir los intercambios. Este parámetro es útil para evitar la pérdida de tiempo de la máquina al comprimir los intercambios pequeños. +The umbral de tamaño (bytes) de las peticiones por debajo del cual no se deben comprimir los intercambios. Este parámetro es útil para evitar la pérdida de tiempo de la máquina al comprimir los intercambios pequeños. Umbral de compresión por defecto = 1024 bytes @@ -340,7 +340,7 @@ Umbral de compresión por defecto = 1024 bytes **.HTTPEnabled** : Boolean -El estado del protocolo HTTP. +The estado del protocolo HTTP. @@ -351,7 +351,7 @@ El estado del protocolo HTTP**.HTTPPort** : Number -El número de puerto IP de escucha para HTTP. +The número de puerto IP de escucha para HTTP. Por defecto = 80 @@ -364,7 +364,7 @@ Por defecto = 80 **.HTTPTrace** : Boolean -El activación de `HTTP TRACE`. Por razones de seguridad, por defecto el servidor web rechaza las peticiones `HTTP TRACE` con un error 405. Cuando se activa, el servidor web responde a las peticiones `HTTP TRACE` con la línea de petición, el encabezado y el cuerpo. +The activación de `HTTP TRACE`. Por razones de seguridad, por defecto el servidor web rechaza las peticiones `HTTP TRACE` con un error 405. Cuando se activa, el servidor web responde a las peticiones `HTTP TRACE` con la línea de petición, el encabezado y el cuerpo. @@ -375,7 +375,7 @@ El activación de `HTTP TRACE`**.HTTPSEnabled** : Boolean -El estado del protocolo HTTPS. +The estado del protocolo HTTPS. @@ -386,7 +386,7 @@ El estado del protocolo HTTPS**.HTTPSPort** : Number -El número de puerto IP de escucha para HTTPS. +The número de puerto IP de escucha para HTTPS. Por defecto = 443 @@ -400,7 +400,7 @@ Por defecto = 443 > Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession). -El duración de vida (en minutos) de los procesos de sesión legacy inactivos. Al final del tiempo de espera, el proceso se mata en el servidor, se llama al método base `On Web Legacy Close Session` y se destruye el contexto de la sesión heredada. +The duración de vida (en minutos) de los procesos de sesión legacy inactivos. Al final del tiempo de espera, el proceso se mata en el servidor, se llama al método base `On Web Legacy Close Session` y se destruye el contexto de la sesión heredada. Por defecto = 480 minutos @@ -414,7 +414,7 @@ Por defecto = 480 minutos > Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession). -El duración de vida (en minutos) de las sesiones legacy inactivas (duración definida en la cookie). Al final de este periodo, la cookie de sesión expira y deja de ser enviada por el cliente HTTP. +The duración de vida (en minutos) de las sesiones legacy inactivas (duración definida en la cookie). Al final de este periodo, la cookie de sesión expira y deja de ser enviada por el cliente HTTP. Por defecto = 480 minutos @@ -427,7 +427,7 @@ Por defecto = 480 minutos **.IPAddressToListen** : Text -El Dirección IP en la que el servidor web 4D recibirá las peticiones HTTP. Por defecto, no se define ninguna dirección específica. Se soportan tanto los formatos de cadena IPv6 como los IPv4. +The Dirección IP en la que el servidor web 4D recibirá las peticiones HTTP. Por defecto, no se define ninguna dirección específica. Se soportan tanto los formatos de cadena IPv6 como los IPv4. @@ -440,7 +440,7 @@ El Dirección IP en la que *Propiedad de sólo lectura* -El estado de ejecución del servidor web. +The estado de ejecución del servidor web. @@ -466,7 +466,7 @@ Contiene `True` si las sesiones **.logRecording** : Number -El valor de registro del log de peticiones (logweb.txt). +The valor de registro del log de peticiones (logweb.txt). - 0 = No registrar (por defecto) - 1 = Registro en formato CLF @@ -483,7 +483,7 @@ El valor de registro del log de **.maxConcurrentProcesses** : Number -El número máximo de procesos web simultáneos soportados por el servidor web. Cuando se alcance este número (menos uno), 4D no creará ningún otro proceso y devolverá el estado HTTP 503 - Servicio no disponible a todas las nuevas peticiones. +The número máximo de procesos web simultáneos soportados por el servidor web. Cuando se alcance este número (menos uno), 4D no creará ningún otro proceso y devolverá el estado HTTP 503 - Servicio no disponible a todas las nuevas peticiones. Valores posibles: 500000 - 2147483647 @@ -523,7 +523,7 @@ Contiene el número máximo de s **.minTLSVersion** : Number -El versión mínima de TLS aceptada para las conexiones. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. +The versión mínima de TLS aceptada para las conexiones. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. Valores posibles: @@ -545,7 +545,7 @@ Valores posibles: *Propiedad de sólo lectura* -El nombre de la aplicación del servidor web. +The nombre de la aplicación del servidor web. @@ -558,7 +558,7 @@ El nombre de la aplicación del servido *Propiedad de sólo lectura* -El versión de la librería OpenSSL utilizada. +The versión de la librería OpenSSL utilizada. @@ -571,7 +571,7 @@ El versión de la librería O *Propiedad de sólo lectura* -El disponibilidad de PFS en el servidor. +The disponibilidad de PFS en el servidor. @@ -581,7 +581,7 @@ El disponibilidad de P **.rootFolder** : Text -El ruta de la carpeta raíz del servidor web. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings`, puede ser un objeto `Folder`. +The ruta de la carpeta raíz del servidor web. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings`, puede ser un objeto `Folder`. @@ -607,7 +607,7 @@ Contiene `True` si las sesio **.sessionCookieDomain** : Text -El campo "domain" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/*.4d.fr" para este selector, el cliente sólo enviará una cookie cuando la solicitud se dirija al dominio ".4d.fr", lo que excluye a los servidores que alojan datos estáticos externos. +The campo "domain" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/*.4d.fr" para este selector, el cliente sólo enviará una cookie cuando la solicitud se dirija al dominio ".4d.fr", lo que excluye a los servidores que alojan datos estáticos externos. @@ -618,7 +618,7 @@ El campo "domain" de la **.sessionCookieName** : Text -El nombre de la cookie utilizada para almacenar el ID de sesión. +The nombre de la cookie utilizada para almacenar el ID de sesión. *Propiedad de sólo lectura* @@ -631,7 +631,7 @@ El nombre de la cookie uti **.sessionCookiePath** : Text -El campo "path" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/4DACTION" para este selector, el cliente sólo enviará una cookie para las peticiones dinámicas que empiecen por 4DACTION, y no para las imágenes, páginas estáticas, etc. +The campo "path" de la cookie de sesión. Se utiliza para controlar el alcance de las cookies de sesión. Si define, por ejemplo, el valor "/4DACTION" para este selector, el cliente sólo enviará una cookie para las peticiones dinámicas que empiecen por 4DACTION, y no para las imágenes, páginas estáticas, etc. @@ -650,7 +650,7 @@ El campo "path" de la cook **.sessionCookieSameSite** : Text -El valor de la cookie de session "SameSite". Valores posibles (utilizando constantes): +The valor de la cookie de session "SameSite". Valores posibles (utilizando constantes): | Constante | Valor | Descripción | | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -671,7 +671,7 @@ Ver la descripción de [Session Cookie SameSite](WebServer/webServerConfig.md#se > Esta propiedad no se utiliza en el modo [sesiones escalables](#scalablesession) (no hay validación de la dirección IP). -El validación de la dirección IP para las cookies de sesión. Por razones de seguridad, por defecto el servidor web comprueba la dirección IP de cada solicitud que contiene una cookie de sesión y la rechaza si esta dirección no coincide con la dirección IP utilizada para crear la cookie. En algunas aplicaciones específicas, es posible que desee desactivar esta validación y aceptar las cookies de sesión, incluso cuando sus direcciones IP no coinciden. Por ejemplo, cuando los dispositivos móviles cambian entre las redes WiFi y 3G/4G, su dirección IP cambiará. En este caso, puede permitir que los clientes puedan seguir utilizando sus sesiones web incluso cuando las direcciones IP cambien (esta configuración reduce el nivel de seguridad de su aplicación). +The validación de la dirección IP para las cookies de sesión. Por razones de seguridad, por defecto el servidor web comprueba la dirección IP de cada solicitud que contiene una cookie de sesión y la rechaza si esta dirección no coincide con la dirección IP utilizada para crear la cookie. En algunas aplicaciones específicas, es posible que desee desactivar esta validación y aceptar las cookies de sesión, incluso cuando sus direcciones IP no coinciden. Por ejemplo, cuando los dispositivos móviles cambian entre las redes WiFi y 3G/4G, su dirección IP cambiará. En este caso, puede permitir que los clientes puedan seguir utilizando sus sesiones web incluso cuando las direcciones IP cambien (esta configuración reduce el nivel de seguridad de su aplicación). @@ -693,10 +693,10 @@ El validación de
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|----|---| -|settings|Object|->|Web server settings to set at startup| -|Result|Object|<-|Status of the web server startup| +|settings|Object|->|Configuración del servidor web para establecer al inicio| +|Resultado|Object|<-|Status of the web server startup|
    From 0d4b9d752fb5cede15f7c7ba3d35f8f5c2524721 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:40:45 +0200 Subject: [PATCH 35/99] New translations ziparchiveclass.md (Spanish) --- .../version-20/API/ZipArchiveClass.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/ZipArchiveClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/ZipArchiveClass.md index c09f3b96f75cf9..924626c22cedb8 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/ZipArchiveClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/ZipArchiveClass.md @@ -52,14 +52,14 @@ End if
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|fileToZip|4D.File|->|File or Folder object to compress| -|folderToZip|4D.Folder|->|File or Folder object to compress| -|zipStructure|Object|->|File or Folder object to compress| -|destinationFile|4D.File|->|Destination file for the archive| -|options|Integer|->|*folderToZip* option: `ZIP Without enclosing folder`| -|Result|Object|<-|Status object| +|fileToZip|4D.File|->|Objeto Archivo o Carpeta a comprimir| +|folderToZip|4D.Folder|->|Objeto Archivo o Carpeta a comprimir| +|zipStructure|Object|->|Objeto Archivo o Carpeta a comprimir| +|destinationFile|4D.File|->|Archivo de destino del archivo| +|options|Integer|->|Opción *folderToZip*: `ZIP Without enclosing folder`| +|Resultado|Object|<-|Status object|
    @@ -77,7 +77,7 @@ Puede pasar un objeto 4D.File, 4D.Folder, o una estructura zip como primer pará | Propiedad | Tipo | Descripción | | ------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| compression | Integer |
  • `ZIP Compression standard`: Reducir la compresión (por defecto)
  • `ZIP Compression LZMA`: compresión LZMA
  • `ZIP Compression XZ`: compresión XZ
  • `ZIP Compression none`: sin compresión
  • | +| compression | Integer |
  • `ZIP Compression standard`: reducir la compresión (por defecto)
  • `ZIP Compression LZMA`: compresión LZMA
  • `ZIP Compression XZ`: compresión XZ
  • `ZIP Compression none`: sin compresión
  • | | level | Integer | Nivel de compresión. Valores posibles: 1 a 10. Un valor más bajo producirá un archivo más grande, mientras que un valor más alto producirá un archivo más pequeño. Sin embargo, el nivel de compresión influye en el rendimiento. Valores por defecto si se omiten:
  • `ZIP Compression standard`: 6
  • `ZIP Compression LZMA`: 4
  • `ZIP Compression XZ`: 4
  • | | encryption | Integer | La encriptación a utilizar si se define una contraseña:
  • `ZIP Encryption AES128`: encriptación AES con una llave de 128 bits.
  • `ZIP Encryption AES192`: encriptación AES con una llave de 192 bits.
  • `ZIP Encryption AES256`: encriptación AES con una llave de 256 bits (por defecto si se define la contraseña).
  • `ZIP Encryption none`: los datos no están encriptados (por defecto si no se define una contraseña)
  • | | contraseña | Text | Una contraseña a utilizar si se requiere encriptación. | @@ -208,11 +208,11 @@ $err:=ZIP Create archive($zip; $destination)
    -|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|zipFile|4D.File|->|Zip archive file| -|password|Text|->|ZIP archive password if any| -|Result|4D.ZipArchive|<-|Archive object| +|zipFile|4D.File|->|Archivo Zip| +|password|Text|->|Contraseña del archivo Zip si la hubiera| +|Resultado|4D.ZipArchive|<-|Archive object|
    From 177a82e53ff7c0466edcc3e36fb54a28b10f47bc Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:44:28 +0200 Subject: [PATCH 36/99] New translations onafterkeystroke.md (Spanish) --- .../version-20/Events/onAfterKeystroke.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAfterKeystroke.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAfterKeystroke.md index 9a329090b9540b..f3580605419424 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAfterKeystroke.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAfterKeystroke.md @@ -24,7 +24,7 @@ Después de que las propiedades de evento [`On Before Keystroke`](onBeforeKeystr El evento `On After Keystroke` no se genera: -- in [list box columns](FormObjects/listbox-column.md) method except when a cell is being edited (however it is generated in any cases in the [list box](FormObjects/listbox_overview.md) method), +- en el método [columnas de list box](FormObjects/listbox-column.md) excepto cuando se está editando una celda (sin embargo se genera en cualquier caso en el método [list box](FormObjects/listbox_overview.md)), - cuando las modificaciones usuario no se realizan con el teclado (pegar, arrastrar y soltar, casilla de verificación, lista desplegable, combo box). Para procesar estos eventos, debe utilizar [`On After Edit`](onAfterEdit.md). ### Secuencia de tecla From d593cbcfb1b34dce31d486aec8dbeed10470fe24 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:44:30 +0200 Subject: [PATCH 37/99] New translations onalternativeclick.md (Spanish) --- .../version-20/Events/onAlternativeClick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAlternativeClick.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAlternativeClick.md index e7d25d23ffdd4f..93d46702e3f75a 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAlternativeClick.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onAlternativeClick.md @@ -5,7 +5,7 @@ title: On Alternative Click | Code | Puede ser llamado por | Definición | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | -| 38 | [Button](FormObjects/button_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) |
  • Botones: el área "flecha" de un botón se presiona
  • List box: en una columna de un array, se hace clic en un botón de selección (atributo "alternateButton")
  • | +| 38 | [Botón](FormObjects/button_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna List Box](FormObjects/listbox-column.md) |
  • Botones: el área "flecha" de un botón se presiona
  • List box: en una columna de un array, se hace clic en un botón de selección (atributo "alternateButton")
  • | ## Descripción From 256eca110d3dba9ba13b49ac7c89175589b9dbca Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:45:16 +0200 Subject: [PATCH 38/99] New translations onbeforekeystroke.md (Spanish) --- .../version-20/Events/onBeforeKeystroke.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onBeforeKeystroke.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onBeforeKeystroke.md index 94bbe0765c588c..456a067a0578c1 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onBeforeKeystroke.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onBeforeKeystroke.md @@ -22,7 +22,7 @@ Después de haber seleccionado los eventos `On Before Keystroke` y [`On After Ke El evento `On Before Keystroke` no se genera: -- in a [List Box Column](FormObjects/listbox-column.md) method except when a cell is being edited (however it is generated in any cases in the [list box](FormObjects/listbox_overview.md) method), +- en un método [columna List Box](FormObjects/listbox-column.md) excepto cuando se está editando una celda (sin embargo, se genera en cualquier caso en el método [List Box](FormObjects/listbox_overview.md)), - cuando las modificaciones usuario no se realizan con el teclado (pegar, arrastrar y soltar, casilla de verificación, lista desplegable, combo box). Para procesar estos eventos, debe utilizar [`On After Edit`](onAfterEdit.md). ### Objetos no editables From ccd9cc296433b3c74d0156e1d4f93339c6585b95 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:46:16 +0200 Subject: [PATCH 39/99] New translations onheaderclick.md (Spanish) --- .../version-20/Events/onHeaderClick.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onHeaderClick.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onHeaderClick.md index fa5f42768ee6de..61ac555ef4855f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onHeaderClick.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onHeaderClick.md @@ -3,9 +3,9 @@ id: onHeaderClick title: On Header Click --- -| Code | Puede ser llamado por | Definición | -| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 42 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) | Se produce un clic en el encabezado de columna | +| Code | Puede ser llamado por | Definición | +| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- | +| 42 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box](FormObjects/listbox-column.md) | Se produce un clic en el encabezado de columna | ## Descripción From 89ff41acfe0d3e71ac2217c3cb5ac52360e8db0b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:46:18 +0200 Subject: [PATCH 40/99] New translations onload.md (Spanish) --- .../version-20/Events/onLoad.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onLoad.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onLoad.md index 16c1fe5b8dcad8..a351a0f239f2b5 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onLoad.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onLoad.md @@ -3,9 +3,9 @@ id: onLoad title: On Load --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | -| 1 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [4D Write Pro area](FormObjects/writeProArea_overview.md) - [Button](FormObjects/button_overview.md) - [Button Grid](FormObjects/buttonGrid_overview.md) - [Check Box](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Dropdown list](FormObjects/dropdownList_Overview.md) - Form - [Hierarchical List](FormObjects/list_overview.md) - [Input](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) - [Picture Button](FormObjects/pictureButton_overview.md) - [Picture Pop up menu](FormObjects/picturePopupMenu_overview.md) - [Plug-in Area](FormObjects/pluginArea_overview.md) - [Progress Indicators](FormObjects/progressIndicator.md) - [Radio Button](FormObjects/radio_overview.md) - [Ruler](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subform](FormObjects/subform_overview.md) - [Tab control](FormObjects/tabControl.md) - [Web Area](FormObjects/webArea_overview.md) | El formulario está a punto de ser mostrado o impreso | +| Code | Puede ser llamado por | Definición | +| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| 1 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](FormObjects/writeProArea_overview.md) - [Botón](FormObjects/button_overview.md) - [Rejilla de botones](FormObjects/buttonGrid_overview.md) - [Casilla de selección](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Lista desplegable](FormObjects/dropdownList_Overview.md) - Formulario - [Lista jerárquica](FormObjects/list_overview.md) - [Entrada](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box ](FormObjects/listbox-column.md) - [Botón imagen](FormObjects/pictureButton_overview.md) - [Menú pop up imagen](FormObjects/picturePopupMenu_overview.md) - [Área de plug-in](FormObjects/pluginArea_overview.md) - [Indicador de progreso ](FormObjects/progressIndicator.md) - [Botón radio](FormObjects/radio_overview.md) - [Regla](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subformulario](FormObjects/subform_overview.md) - [Control de pestañas](FormObjects/tabControl.md) - [Área Web](FormObjects/webArea_overview.md) | El formulario está a punto de ser mostrado o impreso | ## Descripción From 5bb3f31582341a0a701ee42cc0c7cfd84fee13d4 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:47:48 +0200 Subject: [PATCH 41/99] New translations onrowmoved.md (Spanish) --- .../version-20/Events/onRowMoved.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onRowMoved.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onRowMoved.md index 6c7e4af8fa5ca4..539b7ce688f0f6 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onRowMoved.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onRowMoved.md @@ -3,9 +3,9 @@ id: onRowMoved title: On Row Moved --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -| 34 | [List Box of the array type](FormObjects/listbox_overview.md#array-list-boxes) - [List Box Column](FormObjects/listbox-column.md) | Una línea de list box es movida por el usuario por medio de arrastrar y soltar | +| Code | Puede ser llamado por | Definición | +| ---- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| 34 | [List Box de tipo array](FormObjects/listbox_overview.md#array-list-boxes) - [List Box Columna](FormObjects/listbox-column.md) | Una línea de list box es movida por el usuario por medio de arrastrar y soltar | ## Descripción From 4a7814343da87428a107b4358f97585e1e60df9a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:47:53 +0200 Subject: [PATCH 42/99] New translations onunload.md (Spanish) --- .../version-20/Events/onUnload.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onUnload.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onUnload.md index dea1e96bb1a951..fde2d0a10b100f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onUnload.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onUnload.md @@ -3,9 +3,9 @@ id: onUnload title: On Unload --- -| Code | Puede ser llamado por | Definición | -| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| 24 | [4D View Pro Area](FormObjects/viewProArea_overview.md) - [4D Write Pro area](FormObjects/writeProArea_overview.md) - [Button](FormObjects/button_overview.md) - [Button Grid](FormObjects/buttonGrid_overview.md) - [Check Box](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Dropdown list](FormObjects/dropdownList_Overview.md) - Form - [Hierarchical List](FormObjects/list_overview.md) - [Input](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [List Box Column](FormObjects/listbox-column.md) - [Picture Button](FormObjects/pictureButton_overview.md) - [Picture Pop up menu](FormObjects/picturePopupMenu_overview.md) - [Plug-in Area](FormObjects/pluginArea_overview.md) - [Progress Indicators](FormObjects/progressIndicator.md) - [Radio Button](FormObjects/radio_overview.md) - [Ruler](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subform](FormObjects/subform_overview.md) - [Tab control](FormObjects/tabControl.md) - [Web Area](FormObjects/webArea_overview.md) | El formulario está a punto de salir y liberarse | +| Code | Puede ser llamado por | Definición | +| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| 24 | [Área 4D View Pro](FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](FormObjects/writeProArea_overview.md) - [Botón](FormObjects/button_overview.md) - [Rejilla de botones](FormObjects/buttonGrid_overview.md) - [Casilla de selección](FormObjects/checkbox_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - [Lista desplegable](FormObjects/dropdownList_Overview.md) - Formulario - [Lista jerárquica](FormObjects/list_overview.md) - [Entrada](FormObjects/input_overview.md) - [List Box](FormObjects/listbox_overview.md) - [Columna de List Box ](FormObjects/listbox-column.md) - [Botón imagen](FormObjects/pictureButton_overview.md) - [Menú pop up imagen](FormObjects/picturePopupMenu_overview.md) - [Área de plug-in](FormObjects/pluginArea_overview.md) - [Indicador de progreso ](FormObjects/progressIndicator.md) - [Botón radio](FormObjects/radio_overview.md) - [Regla](FormObjects/ruler.md) - [Spinner](FormObjects/spinner.md) - [Splitter](FormObjects/splitters.md) - [Stepper](FormObjects/stepper.md) - [Subformulario](FormObjects/subform_overview.md) - [Control de pestañas](FormObjects/tabControl.md) - [Área Web](FormObjects/webArea_overview.md) | El formulario está a punto de salir y liberarse | ## Descripción From e8612d8d4f87c16455390b2530c0b5220375fdf6 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:48:36 +0200 Subject: [PATCH 43/99] New translations onvalidate.md (Spanish) --- .../version-20/Events/onValidate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onValidate.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onValidate.md index be10ac3ab75d4d..5a75184b752c45 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onValidate.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/onValidate.md @@ -10,7 +10,7 @@ title: On Validate ## Descripción -This event is triggered when the record data entry has been validated, for example after an `accept` [standard action](FormObjects/properties_Action.md#standard-action). +Este evento se activa cuando se ha validado la entrada de datos del registro, por ejemplo después de una [acción estándar ](FormObjects/properties_Action.md#standard-action) `accept`. ### Subformulario From e5e125f8425f43bc5e63772a6e630ef16f1af4a1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:48:40 +0200 Subject: [PATCH 44/99] New translations overview.md (Spanish) --- .../version-20/Events/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/overview.md index b6c52763b8eb31..462b586912af54 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/Events/overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/Events/overview.md @@ -28,7 +28,7 @@ Cada evento es devuelto como un objeto por el comando `FORM Event`. Por defecto, Se devuelven propiedades adicionales cuando el evento se produce en objetos específicos. En particular: -- [list boxes](FormObjects/listbox-object.md#supported-form-events) and [list box columns](FormObjects/listbox-column.md#supported-form-events) return [additional properties](FormObjects/listbox-object.md#supported-form-events) such as `columnName` or `isRowSelected`. +- Los [list box](FormObjects/listbox-object.md#supported-form-events) y las [columnas de list box](FormObjects/listbox-column.md#supported-form-events) devuelven las [propiedades adicionales](FormObjects/listbox-object.md#supported-form-events) tales como `columnName` o `isRowSelected`. - Las [áreas de View Pro](FormObjects/viewProArea_overview.md) devuelven por ejemplo las propiedades `sheetName` o `action` en el objeto evento [On After Edit](onAfterEdit.md). From fd3e62afc80f2eb09f72903cb53c5eeba9b651cc Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 02:48:47 +0200 Subject: [PATCH 45/99] New translations formeditor.md (Spanish) --- .../version-20/FormEditor/formEditor.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/FormEditor/formEditor.md b/i18n/es/docusaurus-plugin-content-docs/version-20/FormEditor/formEditor.md index dd85d58a049e18..553a8e7a57d642 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/FormEditor/formEditor.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/FormEditor/formEditor.md @@ -56,7 +56,7 @@ La barra de herramientas contiene los siguientes elementos: | Icono | Nombre | Descripción | | ------------------------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ![](../assets/en/FormEditor/execute.png) | Ejecutar el formulario | Se utiliza para probar la ejecución del formulario. Al presionar este botón, 4D abre una nueva ventana y muestra el formulario en su contexto (lista de registros para un formulario lista y página de registro actual para un formulario detallado). El formulario se ejecuta en el proceso principal. | -| ![](../assets/en/FormEditor/selection.png) | [Herramienta de selección](#selecting-objects) | Allows selecting, moving and resizing form objects.
    **Note**: When an object of the Text or Group Box type is selected, pressing the **Enter** key lets you switch to editing mode. | +| ![](../assets/en/FormEditor/selection.png) | [Herramienta de selección](#selecting-objects) | Permite seleccionar, mover y cambiar el tamaño de los objetos del formulario.
    **Nota**: cuando se selecciona un objeto de tipo Texto o Área de Grupo, al presionar la tecla **Intro** se pasa al modo de edición. | | ![](../assets/en/FormEditor/zOrder.png) | [Orden de entrada](#data-entry-order) | Pasa al modo "Orden de entrada", donde es posible ver y cambiar el orden de entrada actual del formulario. Tenga en cuenta que las marcas permiten ver el orden de entrada actual, sin dejar de trabajar en el formulario. | | ![](../assets/en/FormEditor/moving.png) | [Desplazamiento](#moving-objects) | Pasa al modo " Desplazamiento ", en el que es posible llegar rápidamente a cualquier parte del formulario utilizando la función de arrastrar y soltar en la ventana. El cursor toma la forma de una mano. Este modo de navegación es especialmente útil cuando se hace zoom en el formulario. | | ![](../assets/en/FormEditor/zoom.png) | [Zoom](#zoom) | Permite modificar la escala de visualización del formulario (100% por defecto). Puede pasar al modo "Zoom" haciendo clic en la lupa o pulsando directamente en la barra correspondiente a la escala deseada. Esta función se detalla en la sección anterior. | @@ -235,12 +235,12 @@ La agrupación sólo afecta a los objetos en el editor de formularios. Cuando se Para agrupar los objetos: 1. Seleccione los objetos que desea agrupar. -2. Elija **Agrupar** en el menú Objetos. OR Click the Group button in the toolbar of the Form editor:
    ![](../assets/en/FormEditor/group.png) 4D marks the boundary of the newly grouped objects with handles. No hay marcas que delimiten ninguno de los objetos individuales del grupo. Ahora, al modificar el objeto agrupado, se modifican todos los objetos que componen el grupo. +2. Elija **Agrupar** en el menú Objetos. O Haga clic en el botón Agrupar en la barra de herramientas del editor de formularios:
    ![](../assets/en/FormEditor/group.png) 4D marca el límite de los objetos recién agrupados con manijas. No hay marcas que delimiten ninguno de los objetos individuales del grupo. Ahora, al modificar el objeto agrupado, se modifican todos los objetos que componen el grupo. Para desagrupar un grupo de objetos: 1. Seleccione el grupo de objetos que desea desagrupar. -2. Choose **Ungroup** from the **Object** menu.
    OR
    Click the **Ungroup** button (variant of the **Group** button) in the toolbar of the Form editor.
    If **Ungroup** is dimmed, this means that the selected object is already separated into its simplest form. 4D marca los bordes de los objetos individuales con marcas. +2. Seleccione **Desagrupar** en el menú **Objeto**.
    O
    Haga clic en el botón **Desagrupar** (variante del botón **Agrupar**) de la barra de herramientas del editor de formularios.
    Si **Desagrupar** aparece atenuado, significa que el objeto seleccionado ya está separado en su forma más simple. 4D marca los bordes de los objetos individuales con marcas. ### Alinear objetos @@ -304,7 +304,7 @@ Para repartir los objetos con igual espacio: 1. Seleccione tres o más objetos y haga clic en la herramienta Distribuir correspondiente. -2. In the toolbar, click on the distribution tool that corresponds to the distribution you want to apply.
    ![](../assets/en/FormEditor/distributionTool.png)
    OR
    Select a distribution menu command from the **Align** submenu in the **Object** menu or from the context menu of the editor. 4D distribuye los objetos consecuentemente. Los objetos se distribuyen utilizando la distancia a sus centros y se utiliza como referencia la mayor distancia entre dos objetos consecutivos. +2. En la barra de herramientas, haga clic en la herramienta de distribución correspondiente a la distribución que desee aplicar.
    ![](../assets/en/FormEditor/distributionTool.png)
    O
    Seleccione un comando de menú de distribución en el submenú **Alinear** del menú **Objeto** o en el menú contextual del editor. 4D distribuye los objetos consecuentemente. Los objetos se distribuyen utilizando la distancia a sus centros y se utiliza como referencia la mayor distancia entre dos objetos consecutivos. Para distribuir objetos utilizando la caja de diálogo Alinear y Distribuir: @@ -312,9 +312,9 @@ Para distribuir objetos utilizando la caja de diálogo Alinear y Distribuir: 2. Seleccione el comando **Alineación** del submenú **Alinear** del menú **Objeto** o del menú contextual del editor. Aparece la siguiente caja de diálogo:![](../assets/en/FormEditor/alignmentAssistant.png) -3. In the Left/Right Alignment and/or Top/Bottom Alignment areas, click the standard distribution icon: ![](../assets/en/FormEditor/horizontalDistribution.png)
    (Standard horizontal distribution icon)
    The example area displays the results of your selection. +3. En las áreas Alineación izquierda/derecha y/o Alineación superior/inferior, haga clic en el icono de distribución estándar: ![](../assets/en/FormEditor/horizontalDistribution.png)
    (Icono de distribución horizontal estándar)
    El área de ejemplo muestra los resultados de su selección. -4. To perform a distribution that uses the standard scheme, click **Preview** or *Apply*.
    In this case 4D will perform a standard distribution, so that the objects are set out with an equal amount of space between them.
    OR:
    To execute a specific distribution, select the **Distribute** option (for example if you want to distribute the objects based on the distance to their right side). Esta opción actúa como un interruptor. Si la casilla de selección Distribuir está seleccionada, los iconos situados debajo de ella realizan una función diferente:
    +4. Para realizar una distribución que utiliza el esquema estándar, haga clic en **Vista previa** o *Aplica*.
    En este caso, 4D realizará una distribución estándar para que los objetos estén espaciados de manera equitativa entre ellos.
    O:
    para ejecutar una distribución específica, seleccione la opción **Distribuir** (por ejemplo, si desea distribuir los objetos en función de la distancia a su lado derecho). Esta opción actúa como un interruptor. Si la casilla de selección Distribuir está seleccionada, los iconos situados debajo de ella realizan una función diferente:
    - Horizontalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los lados izquierdo, central (hor.) y derecho de los objetos seleccionados. - Verticalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los bordes superiores, centros (vert.) y bordes inferiores de los objetos seleccionados. @@ -378,7 +378,7 @@ Para ver o cambiar el orden de entrada: El puntero se convierte en un puntero de orden de entrada y 4D dibuja una línea en el formulario mostrando el orden en que selecciona los objetos durante la entrada de datos. Ver y cambiar el orden de entrada de datos son las únicas acciones que puede realizar hasta que haga clic en cualquier herramienta de la paleta Herramientas. -2. To change the data entry order, position the pointer on an object in the form and, while holding down the mouse button, drag the pointer to the object you want next in the data entry order.
    ![](../assets/en/FormEditor/entryOrder3.png)
    4D will adjust the entry order accordingly. +2. Para cambiar el orden de entrada de datos, ubique el puntero sobre un objeto del formulario y mientras mantiene presionado el botón del ratón, arrastre el puntero hasta el objeto que desee a continuación en el orden de entrada de datos.
    ![](../assets/en/FormEditor/entryOrder3.png)
    4D ajustará el orden de entrada en consecuencia. 3. Repita el paso 2 tantas veces como sea necesario para establecer el orden de entrada de datos que desee. From 87b399d3b16b34ab9ec92b1556c9a0ddaa3704c6 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:52:19 +0200 Subject: [PATCH 46/99] New translations updates.md (French) --- i18n/fr/docusaurus-plugin-content-docs/current/Notes/updates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Notes/updates.md b/i18n/fr/docusaurus-plugin-content-docs/current/Notes/updates.md index 64243efc2d0d77..bd492ef06077c5 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Notes/updates.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Notes/updates.md @@ -13,6 +13,8 @@ title: Release Notes - New [`4D.Method` class](../API/MethodClass.md) to create and execute a 4D method code from text source. [`METHOD Get path`](../commands/method-get-path) and [`METHOD RESOLVE PATH`](../commands/method-resolve-path) commands support a new `path volatile method` constant (128). - IMAP transporter now supports mailbox event notifications using the IDLE protocol through a [notifier object](../API/IMAPTransporterClass.md#notifier) of the [4D.IMAPNotifier](../API/IMAPNotifier.md) class, configurable via the `listener` property of [IMAP New transporter](../commands/imap-new-transporter). - Remote [session](../API/SessionClass.md) objects are now [available client-side](../Desktop/sessions.md#availability). +- New [**AI** page in Settings](../settings/ai.md), allowing to configure [Provider model aliases](../aikit/provider-model-aliases.md) that can be called in the code using 4D AIKit component. +- 4D AIKit component: new [Providers](../aikit/Classes/OpenAIProviders.md) class to instantiate and handle [Provider and model aliases](../aikit/provider-model-aliases.md). - Support of [`server` keyword](../Concepts/classes.md#server) for ORDA data model functions and shared/session singleton functions. - Dependencies: support of [components stored on GitLab repositories](../Project/components.md#configuring-a-gitlab-repository). From e806b10d1e6556e36550c9019676e6acd8a06065 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:52:34 +0200 Subject: [PATCH 47/99] New translations updates.md (Spanish) --- i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md b/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md index bedd0e1a09b1ae..86ff3f20f98906 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md @@ -13,6 +13,8 @@ title: Notas del lanzamiento - Nueva clase [`4D.Method`](../API/MethodClass.md) para crear y ejecutar un código de método 4D a partir de una fuente de texto. [`METHOD Get path`](../commands/method-get-path) and [`METHOD RESOLVE PATH`](../commands/method-resolve-path) commands support a new `path volatile method` constant (128). - IMAP transporter now supports mailbox event notifications using the IDLE protocol through a [notifier object](../API/IMAPTransporterClass.md#notifier) of the [4D.IMAPNotifier](../API/IMAPNotifier.md) class, configurable via the `listener` property of [IMAP New transporter](../commands/imap-new-transporter). - Remote [session](../API/SessionClass.md) objects are now [available client-side](../Desktop/sessions.md#availability). +- New [**AI** page in Settings](../settings/ai.md), allowing to configure [Provider model aliases](../aikit/provider-model-aliases.md) that can be called in the code using 4D AIKit component. +- 4D AIKit component: new [Providers](../aikit/Classes/OpenAIProviders.md) class to instantiate and handle [Provider and model aliases](../aikit/provider-model-aliases.md). - Support of [`server` keyword](../Concepts/classes.md#server) for ORDA data model functions and shared/session singleton functions. - Dependencies: support of [components stored on GitLab repositories](../Project/components.md#configuring-a-gitlab-repository). From 6232d6bc848c1aae4b2c6e76e251560fa653db0e Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:52:49 +0200 Subject: [PATCH 48/99] New translations updates.md (Japanese) --- i18n/ja/docusaurus-plugin-content-docs/current/Notes/updates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Notes/updates.md b/i18n/ja/docusaurus-plugin-content-docs/current/Notes/updates.md index a513ac15a1be81..a65074025c7f41 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Notes/updates.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Notes/updates.md @@ -13,6 +13,8 @@ title: リリースノート - テキストソースから4D メソッドを作成し実行するための[`4D.Method` クラス](../API/MethodClass.md)。 [`METHOD Get path`](../commands/method-get-path) および [`METHOD RESOLVE PATH`](../commands/method-resolve-path) コマンドは新しい`path volatile method` 定数 (128) をサポートするようになりました。 - IMAP transporter now supports mailbox event notifications using the IDLE protocol through a [notifier object](../API/IMAPTransporterClass.md#notifier) of the [4D.IMAPNotifier](../API/IMAPNotifier.md) class, configurable via the `listener` property of [IMAP New transporter](../commands/imap-new-transporter). - リモートの[session](../API/SessionClass.md) オブジェクトは、[クライアント側でも利用可能](../Desktop/sessions.md#availability) になりました。 +- New [**AI** page in Settings](../settings/ai.md), allowing to configure [Provider model aliases](../aikit/provider-model-aliases.md) that can be called in the code using 4D AIKit component. +- 4D AIKit component: new [Providers](../aikit/Classes/OpenAIProviders.md) class to instantiate and handle [Provider and model aliases](../aikit/provider-model-aliases.md). - Support of [`server` keyword](../Concepts/classes.md#server) for ORDA data model functions and shared/session singleton functions. - Dependencies: support of [components stored on GitLab repositories](../Project/components.md#configuring-a-gitlab-repository). From a4322b353917dec0bca79f5b3516721144bbb911 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:53:04 +0200 Subject: [PATCH 49/99] New translations updates.md (Portuguese, Brazilian) --- i18n/pt/docusaurus-plugin-content-docs/current/Notes/updates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Notes/updates.md b/i18n/pt/docusaurus-plugin-content-docs/current/Notes/updates.md index ac653bb1f379e5..901233c8525629 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Notes/updates.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Notes/updates.md @@ -13,6 +13,8 @@ title: Notas de lançamento - New [`4D.Method` class](../API/MethodClass.md) to create and execute a 4D method code from text source. [`METHOD Get path`](../commands/method-get-path) and [`METHOD RESOLVE PATH`](../commands/method-resolve-path) commands support a new `path volatile method` constant (128). - IMAP transporter now supports mailbox event notifications using the IDLE protocol through a [notifier object](../API/IMAPTransporterClass.md#notifier) of the [4D.IMAPNotifier](../API/IMAPNotifier.md) class, configurable via the `listener` property of [IMAP New transporter](../commands/imap-new-transporter). - Remote [session](../API/SessionClass.md) objects are now [available client-side](../Desktop/sessions.md#availability). +- New [**AI** page in Settings](../settings/ai.md), allowing to configure [Provider model aliases](../aikit/provider-model-aliases.md) that can be called in the code using 4D AIKit component. +- 4D AIKit component: new [Providers](../aikit/Classes/OpenAIProviders.md) class to instantiate and handle [Provider and model aliases](../aikit/provider-model-aliases.md). - Support of [`server` keyword](../Concepts/classes.md#server) for ORDA data model functions and shared/session singleton functions. - Dependencies: support of [components stored on GitLab repositories](../Project/components.md#configuring-a-gitlab-repository). From 66a7bd1b4168ead41ba39c0136cf14f67cdc3f1c Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:53:23 +0200 Subject: [PATCH 50/99] New translations architecture.md (French) --- .../current/Project/architecture.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Project/architecture.md b/i18n/fr/docusaurus-plugin-content-docs/current/Project/architecture.md index 97876690f2a02b..6d90ffc0fc37e3 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Project/architecture.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Project/architecture.md @@ -59,6 +59,7 @@ Ce fichier texte peut également contenir des clés de configuration, en particu | menus.json | Définit les menus | JSON | | roles.json | [Privilèges, permissions](../ORDA/privileges.md#rolesjson-file) et autres paramètres de sécurité pour le projet | JSON | | settings.4DSettings | Propriétés de *structure*. Elles ne sont pas prises en compte si des *[propriétés utilisateur](#settings-user)* ou des *[propriétés utilisateur pour les données](#settings-user-data)* sont définies (voir également [Priorité des propriétés](../settings/overview.md#priority-of-settings)). **Attention** : dans les applications compilées, les propriétés de structure sont stockés dans le fichier .4dz (lecture seule). Pour les besoins du déploiement, il est nécessaire d'[activer](../settings/overview.md#enabling-user-settings) et d'utiliser les *propriétés utilisateurs* ou les*propriétés utilisateurs pour les données* pour définir des paramétrages personnalisés. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for Structure | JSON | | tips.json | Définit les messages d'aide | JSON | | lists.json | Listes définies | JSON | | filters.json | Filtres définis | JSON | @@ -186,6 +187,7 @@ Ce dossier contient les [**propriétés utilisateur pour les données**](../sett | directory.json | Description des groupes et utilisateurs 4D et de leurs droits d'accès lorsque l'application est lancée avec ce fichier de données. | JSON | | Backup.4DSettings | Paramètres de sauvegarde de la base de données, utilisés pour définir les [options de sauvegarde](Backup/settings.md)) lorsque la base est lancée avec ce fichier de données. Les clés concernant la configuration de la sauvegarde sont décrites dans le manuel *Sauvegarde des clés XML 4D*. | XML | | settings.4DSettings | Propriétés de la base personnalisées pour ce fichier de données. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this data file | JSON | ### `Logs` @@ -212,6 +214,7 @@ Ce dossier contient les [**propriétés utilisateur**](../settings/overview.md#u | BuildApp.4DSettings | Fichier de paramètres de génération, créé automatiquement lors de l'utilisation de la boîte de dialogue du générateur d'applications ou de la commande `BUILD APPLICATION` | XML | | settings.4DSettings | Paramètres personnalisés pour ce projet (tous les fichiers de données) | XML | | logConfig.json | [Fichier de configuration du journal](../Debugging/debugLogFiles.md#using-a-log-configuration-file) personnalisé | json | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this project (all data files) | JSON | ## `userPreferences.` From 1e06c8fdb1b2d0f6eaa94e0db36f27391151de3f Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:53:38 +0200 Subject: [PATCH 51/99] New translations architecture.md (Spanish) --- .../current/Project/architecture.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md b/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md index 8eadbaf72a024a..85b1d5ddc28e06 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md @@ -59,6 +59,7 @@ Este archivo de texto también puede contener llaves de configuración, en parti | menus.json | Definiciones de los menús | JSON | | roles.json | [Privilegios, permisos](../ORDA/privileges.md#rolesjson-file) y otros ajustes de seguridad del proyecto | JSON | | settings.4DSettings | Propiedades de la base *Structure*. No se tienen en cuenta si se definen *[parámetros de usuario](#settings-user)* o *[parámetros de usuario para datos](#settings-user-data)* (ver también [Prioridad de los parámetros](../settings/overview.md#priority-of-settings). **Atención**: en las aplicaciones compiladas, la configuración de la estructura se almacena en el archivo .4dz (de sólo lectura). Para las necesidades de despliegue, es necesario [habilitar](../settings/overview.md#enabling-user-settings) y utilizar *parámetros usuario* o *parámetros usuario para datos* para definir parámetros personalizados. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for Structure | JSON | | tips.json | Mensajes de ayuda definidos | JSON | | lists.json | Listas definidas | JSON | | filters.json | Filtros definidos | JSON | @@ -186,6 +187,7 @@ Esta carpeta contiene [**parámetros usuario para datos**](../settings/overview. | directory.json | Descripción de los grupos y usuarios de 4D y sus derechos de acceso cuando la aplicación se lanza con este archivo de datos. | JSON | | Backup.4DSettings | Parámetros de copia de seguridad de la base de datos, utilizados para definir las [opciones de copia de seguridad](Backup/settings.md) cuando la base se lanza con este archivo de datos. Las llaves relativas a la configuración de la copia de seguridad se describen en el manual *Backup de las llaves XML 4D*. | XML | | settings.4DSettings | Propiedades de la base personalizadas para este archivo de datos. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this data file | JSON | ### `Logs` @@ -212,6 +214,7 @@ Esta carpeta contiene [**parámetros de usuario**](../settings/overview.md#user- | BuildApp.4DSettings | Archivo de parámetros de generación, creado automáticamente cuando se utiliza la caja de diálogo del generador de aplicaciones o del comando `BUILD APPLICATION` | XML | | settings.4DSettings | Parámetros personalizados para este proyecto (todos los archivos de datos) | XML | | logConfig.json | [Archivo de configuración de historial](../Debugging/debugLogFiles.md#using-a-log-configuration-file) personalizado | json | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this project (all data files) | JSON | ## `userPreferences.` From 95e6b4bbb9e31888026f3b5012708167965a8033 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:53:54 +0200 Subject: [PATCH 52/99] New translations architecture.md (Japanese) --- .../current/Project/architecture.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Project/architecture.md b/i18n/ja/docusaurus-plugin-content-docs/current/Project/architecture.md index f55a50cf5cb535..c9ab2a76054d1a 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Project/architecture.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Project/architecture.md @@ -59,6 +59,7 @@ title: アーキテクチャー | menus.json | メニュー定義 | JSON | | roles.json | プロジェクトの [権限、パーミッション](../ORDA/privileges.md#rolesjson-ファイル)およびその他のセキュリティ設定 | JSON | | settings.4DSettings | *ストラクチャー*データベース設定。 *[ユーザー設定](#settings-ユーザー)* または *[データファイル用のユーザー設定](#settings-ユーザーデータ)* が定義されている場合は、そちらの設定が優先されます ([設定の優先順位](../settings/overview.md#設定の優先順位) も参照ください)。 **警告**: コンパイル済みアプリケーションの場合、ストラクチャー設定は読み取り専用の .4dz ファイルに格納されます。 運用時にカスタム設定を定義するには、[ユーザー設定を有効化](../settings/overview.md#ユーザー設定の有効化) し、*ユーザー設定* または *データファイル用のユーザー設定* を使う必要があります。 | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for Structure | JSON | | tips.json | 定義されたヘルプTips | JSON | | lists.json | 定義されたリスト | JSON | | filters.json | 定義されたフィルター | JSON | @@ -174,7 +175,7 @@ Data フォルダーには、データファイルのほか、データに関わ | data.journal | データベースがログファイルを使用する場合のみ作成されます。 ログファイルは2つのバックアップ間のデータ保護を確実なものにするために使用されます。 データに対して実行されたすべての処理が、このファイルに順番に記録されます。 つまりデータに対して操作がおこなわれるたびに、データ上の処理 (操作の実行) とログファイル上の処理 (操作の記録) という 2つの処理が同時に発生します。 ログファイルはユーザーの処理を妨げたり遅くしたりすることなく、独立して構築されます。 データベースは 1つのログファイルしか同時に使用できません。 ログファイルにはレコードの追加・更新・削除やトランザクションなどの処理が記録されます。 ログファイルはデータベースが作成される際にデフォルトで生成されます。 | binary | | data.match | (内部用) テーブル番号に対応する UUID | XML | -(\*) .4db バイナリデータベースからプロジェクトに変換した場合、データファイルは変換による影響を受けません。 このデータファイルの名称を変更して移動させることができます。 +(\*) When the project is created from a .4db binary database, the data file is left untouched. このデータファイルの名称を変更して移動させることができます。 ### `Settings` (ユーザーデータ) @@ -187,6 +188,7 @@ Data フォルダーには、データファイルのほか、データに関わ | directory.json | このデータファイルを使ってアプリケーションが実行されている場合に使用する 4D グループとユーザー、およびアクセス権の定義 | JSON | | Backup.4DSettings | このデータファイルを使ってデータベースが実行されている場合に使用する [バックアップオプション](Backup/settings.md) を定義したデータベースバックアップ設定です。 バックアップ設定に使われるキーについての説明は [バックアップ設定ファイル](https://doc.4d.com/4Dv18/4D/18/4D-XML-Keys-Backup.100-4673706.ja.html) マニュアルを参照ください。 | XML | | settings.4DSettings | データファイル用のカスタムデータベース設定。 | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this data file | JSON | ### `Logs` @@ -213,6 +215,7 @@ Logs フォルダーには、プロジェクトが使用するすべてのログ | BuildApp.4DSettings | アプリケーションビルダーのダイアログボックス、または `BUILD APPLICATION` コマンドを使ったときに自動的に作成されるビルド設定ファイル | XML | | settings.4DSettings | プロジェクト用のカスタム設定 (すべてのデータファイル) | XML | | logConfig.json | カスタムの [ログ設定ファイル](../Debugging/debugLogFiles.md#ログ設定ファイルを使用する) | json | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this project (all data files) | JSON | ## `userPreferences.` From 87ea0c656336866c77791a1efdca5fdbf1908468 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 03:54:08 +0200 Subject: [PATCH 53/99] New translations architecture.md (Portuguese, Brazilian) --- .../current/Project/architecture.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Project/architecture.md b/i18n/pt/docusaurus-plugin-content-docs/current/Project/architecture.md index 0ed50865b253a1..c325089c8780fa 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Project/architecture.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Project/architecture.md @@ -59,6 +59,7 @@ Esse arquivo de texto também pode conter chaves de configuração, em particula | menus.json | Definições de menus | JSON | | roles.json | [Privilégios, permissões](../ORDA/privileges.md#rolesjson-file) e outras configurações de segurança do projeto | JSON | | settings.4DSettings | Propiedades de la base *Structure*. No se tienen en cuenta si se definen *[parámetros de usuario](#settings-user)* o *[parámetros de usuario para datos](#settings-user-data)* (ver también [Prioridad de los parámetros](../settings/overview.md#priority-of-settings). **Atención**: en las aplicaciones compiladas, la configuración de la estructura se almacena en el archivo .4dz (de sólo lectura). Para las necesidades de despliegue, es necesario [habilitar](../settings/overview.md#enabling-user-settings) y utilizar *parámetros usuario* o *parámetros usuario para datos* para definir parámetros personalizados. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for Structure | JSON | | tips.json | Dicas definidas | JSON | | lists.json | Listas definidas | JSON | | filters.json | Filtros definidos | JSON | @@ -186,6 +187,7 @@ Essa pasta contém [**configurações de usuário para os dados**](../settings/o | directory.json | Descrição de os grupos e usuários de 4D e seus direitos de acesso quando o banco for lançado com este arquivo de dados. | JSON | | Backup.4DSettings | Parámetros de copia de seguridad de la base de datos, utilizados para definir las [opciones de copia de seguridad](Backup/settings.md) cuando la base se lanza con este archivo de datos. As teclas relativas à configuração da cópia de segurança são descritas no manual *4D XML Keys Backup*. | XML | | settings.4DSettings | Propriedades personalizadas de o banco de dados para este arquivo de dados. | XML | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this data file | JSON | ### `Logs` @@ -212,6 +214,7 @@ Essa pasta contém [**configurações de usuário**](../settings/overview.md#use | BuildApp.4DSettings | Build settings file, created automatically when using the application builder dialog box or the `BUILD APPLICATION` command | XML | | settings.4DSettings | Definições personalizadas para este projeto (todos os arquivos de dados) | XML | | logConfig.json | [Archivo de configuración de historial](../Debugging/debugLogFiles.md#using-a-log-configuration-file) personalizado | json | +| AIProviders.json | [AI provider configuration file](../settings/ai.md#aiprovidersjson) for this project (all data files) | JSON | ## `userPreferences.` From 4a122e0dbbac8ae66bfe0d00b47838aaf3bfa099 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:56:16 +0200 Subject: [PATCH 54/99] New translations openai.md (French) --- .../current/aikit/Classes/OpenAI.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md index 4e67f7e2e7bc9c..28c927f4594f94 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md @@ -77,3 +77,7 @@ $client.images.generate(...) $client.files.create(...) $client.model.lists(...) ``` + +## Provider Model Aliases + +The OpenAI client supports provider model aliases for easy multi-provider usage. See [Provider Model Aliases](../provider-model-aliases.md) for complete documentation. From c90f586befc3ae87ad5a14ed87f780e3c20f60e9 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:56:28 +0200 Subject: [PATCH 55/99] New translations openai.md (Spanish) --- .../current/aikit/Classes/OpenAI.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md index 6478740c260b03..f7bb2622fc9e95 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md @@ -77,3 +77,7 @@ $client.images.generate(...) $client.files.create(...) $client.model.lists(...) ``` + +## Provider Model Aliases + +The OpenAI client supports provider model aliases for easy multi-provider usage. See [Provider Model Aliases](../provider-model-aliases.md) for complete documentation. From 40d1a74f9c32361cbd43c13bd3a9fee89932307c Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:56:39 +0200 Subject: [PATCH 56/99] New translations openai.md (Japanese) --- .../current/aikit/Classes/OpenAI.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md index e7600f787ec75f..ca90d959f4ba9d 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md @@ -77,3 +77,7 @@ $client.images.generate(...) $client.files.create(...) $client.model.lists(...) ``` + +## Provider Model Aliases + +The OpenAI client supports provider model aliases for easy multi-provider usage. See [Provider Model Aliases](../provider-model-aliases.md) for complete documentation. From 59d41756fd5ec495e42e604aefa5c8883c00889d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:56:49 +0200 Subject: [PATCH 57/99] New translations openai.md (Portuguese, Brazilian) --- .../current/aikit/Classes/OpenAI.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md index d997ac1b8e9866..677ce1b00759e0 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAI.md @@ -77,3 +77,7 @@ $client.images.generate(...) $client.files.create(...) $client.model.lists(...) ``` + +## Provider Model Aliases + +The OpenAI client supports provider model aliases for easy multi-provider usage. See [Provider Model Aliases](../provider-model-aliases.md) for complete documentation. From 337f0eb08e138b10b3faa8d1572610eaa37835a9 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:56:56 +0200 Subject: [PATCH 58/99] New translations openaichatcompletionsparameters.md (French) --- .../OpenAIChatCompletionsParameters.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md index 00ea4e7ebc4671..c61ea26f7df83e 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md @@ -13,20 +13,20 @@ La classe `OpenAIChatCompletionParameters` permet de gérer les paramètres requ ## Propriétés -| Propriété | Type | Valeur par défaut | Description | -| ----------------------- | ---------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `model` | Text | `"gpt-4o-mini"` | ID du modèle à utiliser. | -| `stream` | Boolean | `False` | Indique si la progression partielle doit être retransmise en continu. Si cette option est activée, les tokens seront envoyés sous forme de données uniquement. Une formule de rappel est requise. | -| `stream_options` | Object | `Null` | Propriété pour stream=True. Par exemple : `{include_usage: True}` | -| `max_completion_tokens` | Integer | `0` | Le nombre maximum de tokens qui peuvent être générés dans la réponse. | -| `n` | Integer | `1` | Nombre de réponses à générer pour chaque invite (prompt). | -| `temperature` | Real | `-1` | Température d'échantillonnage à utiliser, entre 0 et 2. Les valeurs élevées rendent la sortie plus aléatoire, tandis que des valeurs faibles la rendent plus ciblée et déterministe. | -| `store` | Boolean | `False` | Stocker ou non le résultat de cette requête de génération de réponse conversationnelle. | -| `reasoning_effort` | Text | `Null` | Contraintes sur l'effort de raisonnement pour les modèles de raisonnement. Les valeurs actuellement prises en charge sont "low", "medium" et "high". | -| `response_format` | Object | `Null` | Un objet spécifiant le format que le modèle doit produire. Compatible avec les sorties structurées. | -| `tools` | Collection | `Null` | Une liste d'outils ([OpenAITool](OpenAITool.md)) que le modèle peut appeler. Seul le type "function" est pris en charge. | -| `tool_choice` | Variant | `Null` | Contrôle l'outil (le cas échéant) qui est appelé par le modèle. Peut être `"none"`, `"auto"`, `"required"`, ou spécifier un outil particulier. | -| `prediction` | Object | `Null` | Contenu de sortie statique, tel que le contenu d'un fichier texte en cours de régénération. | +| Propriété | Type | Valeur par défaut | Description | +| ----------------------- | ---------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | `"gpt-4o-mini"` | ID du modèle à utiliser. Supports [provider:model aliases](../provider-model-aliases.md) for multi-provider usage (e.g., `"openai:gpt-4o"`, `"anthropic:claude-3-opus"`). | +| `stream` | Boolean | `False` | Indique si la progression partielle doit être retransmise en continu. Si cette option est activée, les tokens seront envoyés sous forme de données uniquement. Une formule de rappel est requise. | +| `stream_options` | Object | `Null` | Propriété pour stream=True. Par exemple : `{include_usage: True}` | +| `max_completion_tokens` | Integer | `0` | Le nombre maximum de tokens qui peuvent être générés dans la réponse. | +| `n` | Integer | `1` | Nombre de réponses à générer pour chaque invite (prompt). | +| `temperature` | Real | `-1` | Température d'échantillonnage à utiliser, entre 0 et 2. Les valeurs élevées rendent la sortie plus aléatoire, tandis que des valeurs faibles la rendent plus ciblée et déterministe. | +| `store` | Boolean | `False` | Stocker ou non le résultat de cette requête de génération de réponse conversationnelle. | +| `reasoning_effort` | Text | `Null` | Contraintes sur l'effort de raisonnement pour les modèles de raisonnement. Les valeurs actuellement prises en charge sont "low", "medium" et "high". | +| `response_format` | Object | `Null` | Un objet spécifiant le format que le modèle doit produire. Compatible avec les sorties structurées. | +| `tools` | Collection | `Null` | Une liste d'outils ([OpenAITool](OpenAITool.md)) que le modèle peut appeler. Seul le type "function" est pris en charge. | +| `tool_choice` | Variant | `Null` | Contrôle l'outil (le cas échéant) qui est appelé par le modèle. Peut être `"none"`, `"auto"`, `"required"`, ou spécifier un outil particulier. | +| `prediction` | Object | `Null` | Contenu de sortie statique, tel que le contenu d'un fichier texte en cours de régénération. | ### Propriétés du callback asynchrone From 224fbdadbf6b932c6bf7a7b4e922729ca0ecef31 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:03 +0200 Subject: [PATCH 59/99] New translations openaiimageparameters.md (French) --- .../current/aikit/Classes/OpenAIImageParameters.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md index ab6166c5d4c9df..68a2dc88e3dce5 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md @@ -13,13 +13,13 @@ La classe `OpenAIImageParameters` permet de configurer et gérer les paramètres ## Propriétés -| Nom de propriété | Type | Valeur par défaut | Description | -| ----------------- | ------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| `model` | Text | "dall-e-2" | Spécifie le modèle à utiliser pour la génération d'images. | -| `n` | Integer | 1 | Le nombre d'images à générer (doit être compris entre 1 et 10 ; seul `n=1` est supporté pour `dall-e-3`). | -| `size` | Text | "1024x1024" | La taille des images générées. Doit être conforme aux spécifications du modèle. | -| `style` | Text | "" | Le style des images générées (doit être soit `vivid` soit `natural`). | -| `response_format` | Text | "url" | Le format des images retournées. Doit être `url` ou `b64_json`. | +| Nom de propriété | Type | Valeur par défaut | Description | +| ----------------- | ------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | "dall-e-2" | Spécifie le modèle à utiliser pour la génération d'images. Supports [provider:model aliases](../provider-model-aliases.md). | +| `n` | Integer | 1 | Le nombre d'images à générer (doit être compris entre 1 et 10 ; seul `n=1` est supporté pour `dall-e-3`). | +| `size` | Text | "1024x1024" | La taille des images générées. Doit être conforme aux spécifications du modèle. | +| `style` | Text | "" | Le style des images générées (doit être soit `vivid` soit `natural`). | +| `response_format` | Text | "url" | Le format des images retournées. Doit être `url` ou `b64_json`. | ## Voir également From 1f44ff971166bbdbd3f52113345b36f5e39e91fd Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:09 +0200 Subject: [PATCH 60/99] New translations openaichatcompletionsparameters.md (Spanish) --- .../OpenAIChatCompletionsParameters.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md index 7300e8538ec975..c55aa8b59e42b1 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md @@ -13,20 +13,20 @@ La clase `OpenAIChatCompletionParameters` está diseñada para manejar los pará ## Propiedades -| Propiedad | Tipo | Valor por defecto | Descripción | -| ----------------------- | ---------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `model` | Text | `"gpt-4o-mini"` | ID del modelo a utilizar. | -| `stream` | Boolean | `False` | Si se retransmite el progreso parcial. Si se define, los tokens se enviarán solo como datos. Fórmula de retrollamada necesaria. | -| `stream_options` | Object | `Null` | Propiedad para stream=True. Por ejemplo: `{include_usage: True}` | -| `max_completion_tokens` | Integer | `0` | El número máximo de tokens que se pueden generar en la respuesta. | -| `n` | Integer | `1` | Número de respuestas a generar para cada invite (prompt). | -| `temperature` | Real | `-1` | Qué temperatura de muestreo utilizar, entre 0 y 2. Los valores más altos hacen que la salida sea más aleatoria, mientras que los valores más bajos la hacen más centrada y determinista. | -| `store` | Boolean | `False` | Almacena o no el resultado de esta solicitud de finalización de chat. | -| `reasoning_effort` | Text | `Null` | Restringe el esfuerzo de razonamiento para los modelos de razonamiento. Los valores actualmente soportados son `"low"`, `"medium"` y `"high"`. | -| `response_format` | Object | `Null` | Un objeto que especifica el formato que el modelo debe producir. Compatible con las salidas estructuradas. | -| `herramientas` | Collection | `Null` | Una lista de herramientas ([OpenAITool](OpenAITool.md)) a las que el modelo puede llamar. Sólo se soporta el tipo "function". | -| `tool_choice` | Variant | `Null` | Controla la herramienta (si hay alguna) que es llamada por el modelo. Puede ser `"none"`, `"auto"`, `"required"`, o especificar una herramienta concreta. | -| `prediction` | Object | `Null` | Contenido de salida estático, como el contenido de un archivo texto que se está regenerando. | +| Propiedad | Tipo | Valor por defecto | Descripción | +| ----------------------- | ---------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | `"gpt-4o-mini"` | ID del modelo a utilizar. Supports [provider:model aliases](../provider-model-aliases.md) for multi-provider usage (e.g., `"openai:gpt-4o"`, `"anthropic:claude-3-opus"`). | +| `stream` | Boolean | `False` | Si se retransmite el progreso parcial. Si se define, los tokens se enviarán solo como datos. Fórmula de retrollamada necesaria. | +| `stream_options` | Object | `Null` | Propiedad para stream=True. Por ejemplo: `{include_usage: True}` | +| `max_completion_tokens` | Integer | `0` | El número máximo de tokens que se pueden generar en la respuesta. | +| `n` | Integer | `1` | Número de respuestas a generar para cada invite (prompt). | +| `temperature` | Real | `-1` | Qué temperatura de muestreo utilizar, entre 0 y 2. Los valores más altos hacen que la salida sea más aleatoria, mientras que los valores más bajos la hacen más centrada y determinista. | +| `store` | Boolean | `False` | Almacena o no el resultado de esta solicitud de finalización de chat. | +| `reasoning_effort` | Text | `Null` | Restringe el esfuerzo de razonamiento para los modelos de razonamiento. Los valores actualmente soportados son `"low"`, `"medium"` y `"high"`. | +| `response_format` | Object | `Null` | Un objeto que especifica el formato que el modelo debe producir. Compatible con las salidas estructuradas. | +| `herramientas` | Collection | `Null` | Una lista de herramientas ([OpenAITool](OpenAITool.md)) a las que el modelo puede llamar. Sólo se soporta el tipo "function". | +| `tool_choice` | Variant | `Null` | Controla la herramienta (si hay alguna) que es llamada por el modelo. Puede ser `"none"`, `"auto"`, `"required"`, o especificar una herramienta concreta. | +| `prediction` | Object | `Null` | Contenido de salida estático, como el contenido de un archivo texto que se está regenerando. | ### Propiedades de retrollamada asíncrona From d25aa55ff4ed62daad9a3da1e064e2b0a6b6b8d0 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:16 +0200 Subject: [PATCH 61/99] New translations openaiimageparameters.md (Spanish) --- .../current/aikit/Classes/OpenAIImageParameters.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md index 692705efcc3fa2..01be17f1ebe3e7 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md @@ -13,13 +13,13 @@ The `OpenAIImageParameters` class is designed to configure and manage the parame ## Propiedades -| Nombre de la propiedad | Tipo | Valor por defecto | Descripción | -| ---------------------- | ------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `model` | Text | "dall-e-2" | Especifica el modelo a utilizar para la generación de imágenes. | -| `n` | Integer | 1 | El número de imágenes a generar (debe estar entre 1 y 10; sólo `n=1` es soportado para `dall-e-3`). | -| `size` | Text | "1024x1024" | El tamaño de las imágenes generadas. Debe ajustarse a las especificaciones del modelo. | -| `style` | Text | "" | El estilo de las imágenes generadas (debe ser `vivid` o `natural`). | -| `response_format` | Text | "url" | El formato de las imágenes devueltas puede ser `url` o `b64_json`. | +| Nombre de la propiedad | Tipo | Valor por defecto | Descripción | +| ---------------------- | ------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | "dall-e-2" | Especifica el modelo a utilizar para la generación de imágenes. Supports [provider:model aliases](../provider-model-aliases.md). | +| `n` | Integer | 1 | El número de imágenes a generar (debe estar entre 1 y 10; sólo `n=1` es soportado para `dall-e-3`). | +| `size` | Text | "1024x1024" | El tamaño de las imágenes generadas. Debe ajustarse a las especificaciones del modelo. | +| `style` | Text | "" | El estilo de las imágenes generadas (debe ser `vivid` o `natural`). | +| `response_format` | Text | "url" | El formato de las imágenes devueltas puede ser `url` o `b64_json`. | ## Ver también From 1634bff955d258619e6c026e7eb75047e5ba9e1d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:23 +0200 Subject: [PATCH 62/99] New translations openaichatcompletionsparameters.md (Japanese) --- .../OpenAIChatCompletionsParameters.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md index 5ec4547197b87a..e90fadcdc5f835 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md @@ -13,20 +13,20 @@ title: OpenAIChatCompletionParameters ## プロパティ -| プロパティ | 型 | デフォルト値 | 説明 | -| ----------------------- | ---------- | --------------- | ----------------------------------------------------------------------------------------------------------- | -| `model` | Text | `"gpt-4o-mini"` | 使用するモデルのID。 | -| `stream` | Boolean | `false` | 部分的な進捗をストリームで返すかどうかを決めます。 設定されていれば、トークンはデータオンリーとして送信されます。 コールバックフォーミュラが必要となります。 | -| `stream_options` | Object | `Null` | stream = True の場合のオプションを指定するプロパティ。 例: `{include_usage: True}` | -| `max_completion_tokens` | Integer | `0` | チャット補完の中で生成可能なトークンの最大数。 | -| `n` | Integer | `1` | 各プロンプトに対して生成するチャット補完の数。 | -| `temperature` | Real | `-1` | 使用するサンプリング温度。0から2の間の値。 値が大きいほど出力はよりランダムになり、値が小さいほど出力はより集中して決まりきったものになります。 | -| `store` | Boolean | `false` | このチャット補完リクエストの出力を保存するかどうか。 | -| `reasoning_effort` | Text | `Null` | 推論モデルにおける推論の努力に対する制約。 現在サポートされている値は `"low"`、`"medium"`、および`"high"`です。 | -| `response_format` | Object | `Null` | モデルが出力するフォーマットを指定するオブジェクト。 構造化された出力に対応します。 | -| `ツール` | Collection | `Null` | モデルが呼び出し得るツール([OpenAITool](OpenAITool.md)) の一覧。 "function" 型のみがサポートされます。 | -| `tool_choice` | Variant | `Null` | どのモデルによってどのツール(あれば)が呼び出されるかを管理します。 `"none"`、`"auto"`、`"required"`、または特定のツールを指定することができます。 | -| `prediction` | Object | `Null` | 再生成されているテキストファイルのコンテンツなど、静的に予想される出力内容。 | +| プロパティ | 型 | デフォルト値 | 説明 | +| ----------------------- | ---------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | `"gpt-4o-mini"` | 使用するモデルのID。 Supports [provider:model aliases](../provider-model-aliases.md) for multi-provider usage (e.g., `"openai:gpt-4o"`, `"anthropic:claude-3-opus"`). | +| `stream` | Boolean | `false` | 部分的な進捗をストリームで返すかどうかを決めます。 設定されていれば、トークンはデータオンリーとして送信されます。 コールバックフォーミュラが必要となります。 | +| `stream_options` | Object | `Null` | stream = True の場合のオプションを指定するプロパティ。 例: `{include_usage: True}` | +| `max_completion_tokens` | Integer | `0` | チャット補完の中で生成可能なトークンの最大数。 | +| `n` | Integer | `1` | 各プロンプトに対して生成するチャット補完の数。 | +| `temperature` | Real | `-1` | 使用するサンプリング温度。0から2の間の値。 値が大きいほど出力はよりランダムになり、値が小さいほど出力はより集中して決まりきったものになります。 | +| `store` | Boolean | `false` | このチャット補完リクエストの出力を保存するかどうか。 | +| `reasoning_effort` | Text | `Null` | 推論モデルにおける推論の努力に対する制約。 現在サポートされている値は `"low"`、`"medium"`、および`"high"`です。 | +| `response_format` | Object | `Null` | モデルが出力するフォーマットを指定するオブジェクト。 構造化された出力に対応します。 | +| `ツール` | Collection | `Null` | モデルが呼び出し得るツール([OpenAITool](OpenAITool.md)) の一覧。 "function" 型のみがサポートされます。 | +| `tool_choice` | Variant | `Null` | どのモデルによってどのツール(あれば)が呼び出されるかを管理します。 `"none"`、`"auto"`、`"required"`、または特定のツールを指定することができます。 | +| `prediction` | Object | `Null` | 再生成されているテキストファイルのコンテンツなど、静的に予想される出力内容。 | ### 非同期コールバック用プロパティ From 7d87331b5d448dddc1bdaa4a7c50199bcc0d0c3b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:30 +0200 Subject: [PATCH 63/99] New translations openaiimageparameters.md (Japanese) --- .../current/aikit/Classes/OpenAIImageParameters.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md index 938abaf42238d3..6cc1b394187015 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md @@ -13,13 +13,13 @@ title: OpenAIImageParameters ## プロパティ -| プロパティ名 | 型 | デフォルト値 | 説明 | -| ----------------- | ------- | ----------- | ---------------------------------------------------------------------------------- | -| `model` | Text | "dall-e-2" | 画像生成に使用するモデルを指定します。 | -| `n` | Integer | 1 | 生成する画像の数(1から10の間でなければなりません、また `dall-e-3` では `n=1` のみがサポートされます)。 | -| `size` | Text | "1024x1024" | 生成される画像のサイズ。 モデルの仕様に準拠している必要があります。 | -| `style` | Text | "" | 生成される画像のスタイル(`vivid` または `natural`のどちらかでなければなりません)。 | -| `response_format` | Text | "url" | 返される画像のフォーマット。`url` または `b64_json` のいずれかです。 | +| プロパティ名 | 型 | デフォルト値 | 説明 | +| ----------------- | ------- | ----------- | -------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | "dall-e-2" | 画像生成に使用するモデルを指定します。 Supports [provider:model aliases](../provider-model-aliases.md). | +| `n` | Integer | 1 | 生成する画像の数(1から10の間でなければなりません、また `dall-e-3` では `n=1` のみがサポートされます)。 | +| `size` | Text | "1024x1024" | 生成される画像のサイズ。 モデルの仕様に準拠している必要があります。 | +| `style` | Text | "" | 生成される画像のスタイル(`vivid` または `natural`のどちらかでなければなりません)。 | +| `response_format` | Text | "url" | 返される画像のフォーマット。`url` または `b64_json` のいずれかです。 | ## 参照 From 2ace8259177fe2b9b06bf9088c3405bd4c87f4af Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:36 +0200 Subject: [PATCH 64/99] New translations openaichatcompletionsparameters.md (Portuguese, Brazilian) --- .../OpenAIChatCompletionsParameters.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md index 1b32c11ed9b665..c41a84d41d0d91 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatCompletionsParameters.md @@ -13,20 +13,20 @@ The `OpenAIChatCompletionParameters` class is designed to handle the parameters ## Propriedades -| Propriedade | Tipo | Valor padrão | Descrição | -| ----------------------- | ------------ | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `model` | Text | `"gpt-4o-mini"` | ID of the model to use. | -| `stream` | Parâmetros | `False` | Whether to stream back partial progress. Se definido, os tokens serão enviados como somente dados. Fórmula de retorno de chamada necessária. | -| `stream_options` | Object | `Null` | Property for stream=True. For example: `{include_usage: True}` | -| `max_completion_tokens` | Integer | `0` | The maximum number of tokens that can be generated in the completion. | -| `n` | Integer | `1` | How many completions to generate for each prompt. | -| `temperature` | Real | `-1` | What sampling temperature to use, between 0 and 2. Higher values make the output more random, while lower values make it more focused and deterministic. | -| `store` | Parâmetros | `False` | Whether or not to store the output of this chat completion request. | -| `reasoning_effort` | Text | `Null` | Constrains effort on reasoning for reasoning models. Currently supported values are `"low"`, `"medium"`, and `"high"`. | -| `response_format` | Object | `Null` | An object specifying the format that the model must output. Compatible with structured outputs. | -| `tools` | Collection | `Null` | A list of tools ([OpenAITool](OpenAITool.md)) the model may call. Only "function" type is supported. | -| `tool_choice` | Diferente de | `Null` | Controls which (if any) tool is called by the model. Can be `"none"`, `"auto"`, `"required"`, or specify a particular tool. | -| `prediction` | Object | `Null` | Static predicted output content, such as the content of a text file that is being regenerated. | +| Propriedade | Tipo | Valor padrão | Descrição | +| ----------------------- | ------------ | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | `"gpt-4o-mini"` | ID of the model to use. Supports [provider:model aliases](../provider-model-aliases.md) for multi-provider usage (e.g., `"openai:gpt-4o"`, `"anthropic:claude-3-opus"`). | +| `stream` | Parâmetros | `False` | Whether to stream back partial progress. Se definido, os tokens serão enviados como somente dados. Fórmula de retorno de chamada necessária. | +| `stream_options` | Object | `Null` | Property for stream=True. For example: `{include_usage: True}` | +| `max_completion_tokens` | Integer | `0` | The maximum number of tokens that can be generated in the completion. | +| `n` | Integer | `1` | How many completions to generate for each prompt. | +| `temperature` | Real | `-1` | What sampling temperature to use, between 0 and 2. Higher values make the output more random, while lower values make it more focused and deterministic. | +| `store` | Parâmetros | `False` | Whether or not to store the output of this chat completion request. | +| `reasoning_effort` | Text | `Null` | Constrains effort on reasoning for reasoning models. Currently supported values are `"low"`, `"medium"`, and `"high"`. | +| `response_format` | Object | `Null` | An object specifying the format that the model must output. Compatible with structured outputs. | +| `tools` | Collection | `Null` | A list of tools ([OpenAITool](OpenAITool.md)) the model may call. Only "function" type is supported. | +| `tool_choice` | Diferente de | `Null` | Controls which (if any) tool is called by the model. Can be `"none"`, `"auto"`, `"required"`, or specify a particular tool. | +| `prediction` | Object | `Null` | Static predicted output content, such as the content of a text file that is being regenerated. | ### Asynchronous Callback Properties From ba44ecf1fc67e26e8f40283553e5d1d9c865d067 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:57:43 +0200 Subject: [PATCH 65/99] New translations openaiimageparameters.md (Portuguese, Brazilian) --- .../current/aikit/Classes/OpenAIImageParameters.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md index a0e306ae5e8450..8930586f1ec4a5 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIImageParameters.md @@ -13,13 +13,13 @@ The `OpenAIImageParameters` class is designed to configure and manage the parame ## Propriedades -| Nome da propriedade | Tipo | Valor padrão | Descrição | -| ------------------- | ------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------- | -| `model` | Text | "dall-e-2" | Specifies the model to use for image generation. | -| `n` | Integer | 1 | The number of images to generate (must be between 1 and 10; only `n=1` is supported for `dall-e-3`). | -| `size` | Text | "1024x1024" | O tamanho das imagens geradas. Must conform to model specifications. | -| `style` | Text | "" | O estilo das imagens geradas (deve ser `vivid` ou `natural`). | -| `response_format` | Text | "url" | O formato para imagens retornadas, pode ser `url` ou `b64_json`. | +| Nome da propriedade | Tipo | Valor padrão | Descrição | +| ------------------- | ------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | Text | "dall-e-2" | Specifies the model to use for image generation. Supports [provider:model aliases](../provider-model-aliases.md). | +| `n` | Integer | 1 | The number of images to generate (must be between 1 and 10; only `n=1` is supported for `dall-e-3`). | +| `size` | Text | "1024x1024" | O tamanho das imagens geradas. Must conform to model specifications. | +| `style` | Text | "" | O estilo das imagens geradas (deve ser `vivid` ou `natural`). | +| `response_format` | Text | "url" | O formato para imagens retornadas, pode ser `url` ou `b64_json`. | ## Veja também From 63d031a6d4dc9f74649f8676519ef938345f98ff Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:59:15 +0200 Subject: [PATCH 66/99] New translations openaiembeddingsapi.md (French) --- .../current/aikit/Classes/OpenAIEmbeddingsAPI.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md index f44a428ad7e5b1..26abe440b712ed 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md @@ -17,12 +17,12 @@ https://platform.openai.com/docs/api-reference/embeddings Crée une représentation vectorielle pour l'entrée, le modèle et les paramètres fournis. -| Paramètre | Type | Description | -| ------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -| *input* | Text ou Collection de textes | L'entrée à vectoriser. | -| *model* | Text | Le [modèle à utiliser](https://platform.openai.com/docs/guides/embeddings#embedding-models) | -| *parameters* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | Les paramètres permettant de personnaliser la requête de représentations vectorielles. | -| Résultat | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | Les représentations vectorielles | +| Paramètre | Type | Description | +| ------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| *input* | Text ou Collection de textes | L'entrée à vectoriser. | +| *model* | Text | Le [modèle à utiliser](https://platform.openai.com/docs/guides/embeddings#embedding-models). Supports [provider:model aliases](../provider-model-aliases.md). | +| *parameters* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | Les paramètres permettant de personnaliser la requête de représentations vectorielles. | +| Résultat | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | Les représentations vectorielles | #### Exemples d'utilisation From 05e5d1d744149b66fe02b2cf9e1c17c52809b8d2 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:59:25 +0200 Subject: [PATCH 67/99] New translations openaiembeddingsapi.md (Spanish) --- .../current/aikit/Classes/OpenAIEmbeddingsAPI.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md index cd9d8ecbdada51..66e8d0d248d1c9 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md @@ -17,12 +17,12 @@ https://platform.openai.com/docs/api-reference/embeddings Crea una representación vectorial para la entrada, el modelo y los parámetros ofrecidos. -| Argumento | Tipo | Descripción | -| ------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| *entrada* | Texto o colección de texto | La entrada a vectorizar. | -| *model* | Text | El [modelo a utilizar] (https://platform.openai.com/docs/guides/embeddings#embedding-models) | -| *parámetros* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | Los parámetros para personalizar la petición de representaciones vectoriales. | -| Resultado | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | Las integraciones. | +| Argumento | Tipo | Descripción | +| ------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| *entrada* | Texto o colección de texto | La entrada a vectorizar. | +| *model* | Text | El [modelo a utilizar] (https://platform.openai.com/docs/guides/embeddings#embedding-models). Supports [provider:model aliases](../provider-model-aliases.md). | +| *parámetros* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | Los parámetros para personalizar la petición de representaciones vectoriales. | +| Resultado | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | Las integraciones. | #### Ejemplos de uso From 3d33215e114587fc88384791bd14f1ffaf015142 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:59:35 +0200 Subject: [PATCH 68/99] New translations openaiembeddingsapi.md (Japanese) --- .../current/aikit/Classes/OpenAIEmbeddingsAPI.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md index f21fd7a85be26c..c7c26388b05ecb 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md @@ -17,12 +17,12 @@ https://platform.openai.com/docs/api-reference/embeddings 提供された入力、モデル、パラメータに対する埋め込みを作成します。 -| 引数 | 型 | 説明 | -| ------------ | ----------------------------------------------------------- | --------------------------------------------------------------------- | -| *input* | テキストまたはテキストのコレクション | ベクター化する入力。 | -| *model* | Text | [使用するモデル](https://platform.openai.com/docs/guides/embeddings#埋め込みモデル) | -| *parameters* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | 埋め込みリクエストをカスタマイズするための引数。 | -| 戻り値 | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | 埋め込み。 | +| 引数 | 型 | 説明 | +| ------------ | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| *input* | テキストまたはテキストのコレクション | ベクター化する入力。 | +| *model* | Text | The [model to use](https://platform.openai.com/docs/guides/embeddings#embedding-models). Supports [provider:model aliases](../provider-model-aliases.md). | +| *parameters* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | 埋め込みリクエストをカスタマイズするための引数。 | +| 戻り値 | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | 埋め込み。 | #### 使用例 From 7bebede2bc7297413853993915f9573bfb04aa13 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 04:59:45 +0200 Subject: [PATCH 69/99] New translations openaiembeddingsapi.md (Portuguese, Brazilian) --- .../current/aikit/Classes/OpenAIEmbeddingsAPI.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md index 8c13cc7d1fbba7..5bf0505365d701 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIEmbeddingsAPI.md @@ -17,12 +17,12 @@ https://platform.openai.com/docs/api-reference/embeddings Creates an embeddings for the provided input, model and parameters. -| Argumento | Tipo | Descrição | -| ------------ | ----------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| *entrada* | Text or Collection of Text | The input to vectorize. | -| *model* | Text | The [model to use](https://platform.openai.com/docs/guides/embeddings#embedding-models) | -| *parâmetros* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | The parameters to customize the embeddings request. | -| Resultado | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | The embeddings. | +| Argumento | Tipo | Descrição | +| ------------ | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| *entrada* | Text or Collection of Text | The input to vectorize. | +| *model* | Text | The [model to use](https://platform.openai.com/docs/guides/embeddings#embedding-models). Supports [provider:model aliases](../provider-model-aliases.md). | +| *parâmetros* | [OpenAIEmbeddingsParameters](OpenAIEmbeddingsParameters.md) | The parameters to customize the embeddings request. | +| Resultado | [OpenAIEmbeddingsResult](OpenAIEmbeddingsResult.md) | The embeddings. | #### Example Usages From 145ecfca39651e7455df28376c96bf8fdf72473a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 05:46:41 +0200 Subject: [PATCH 70/99] New translations imap-new-transporter.md (Spanish) --- .../commands/imap-new-transporter.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/imap-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/imap-new-transporter.md index dce455319860cf..aee7b4629d592d 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/imap-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/imap-new-transporter.md @@ -34,18 +34,18 @@ El comando `IMAP New transporter` ](../API/IMAPTransporterClass.md#acceptunsecureconnection)
    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | -| [](../API/IMAPTransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](../API/IMAPTransporterClass.md#checkconnectiondelay)
    | 300 | -| [](../API/IMAPTransporterClass.md#connectiontimeout)
    | 30 | -| [](../API/IMAPTransporterClass.md#host)
    | *obligatorio* | -| [](../API/IMAPTransporterClass.md#logfile)
    | ninguno | -| .**password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | -| [](../API/IMAPTransporterClass.md#port)
    | 993 | -| [](../API/IMAPTransporterClass.md#user)
    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](../API/IMAPTransporterClass.md#acceptunsecureconnection)
    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | +| [](../API/IMAPTransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | +| [](../API/IMAPTransporterClass.md#checkconnectiondelay)
    | 300 | +| [](../API/IMAPTransporterClass.md#connectiontimeout)
    | 30 | +| [](../API/IMAPTransporterClass.md#host)
    | *obligatorio* | +| [](../API/IMAPTransporterClass.md#logfile)
    | ninguno | +| .**password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | +| [](../API/IMAPTransporterClass.md#port)
    | 993 | +| [](../API/IMAPTransporterClass.md#user)
    | ninguno | > **Atención**: asegúrese de que el tiempo de espera definido sea menor que el tiempo de espera del servidor, de lo contrario el tiempo de espera del cliente será inútil. From 2b675277730031031dfa4b86a077fa3c32a43d88 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 05:47:43 +0200 Subject: [PATCH 71/99] New translations pop3-new-transporter.md (Spanish) --- .../commands/pop3-new-transporter.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/pop3-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/pop3-new-transporter.md index 08e00c57313831..e11511d22fd9bb 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/pop3-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/pop3-new-transporter.md @@ -34,17 +34,17 @@ El comando `POP3 New transporter` ](../API/POP3TransporterClass.md#acceptunsecureconnection)
    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | -| [](../API/POP3TransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](../API/POP3TransporterClass.md#connectiontimeout)
    | 30 | -| [](../API/POP3TransporterClass.md#host)
    | *obligatorio* | -| [](../API/POP3TransporterClass.md#logfile)
    | ninguno | -| **.password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | -| [](../API/POP3TransporterClass.md#port)
    | 995 | -| [](../API/POP3TransporterClass.md#user)
    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](../API/POP3TransporterClass.md#acceptunsecureconnection)
    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | +| [](../API/POP3TransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | +| [](../API/POP3TransporterClass.md#connectiontimeout)
    | 30 | +| [](../API/POP3TransporterClass.md#host)
    | *obligatorio* | +| [](../API/POP3TransporterClass.md#logfile)
    | ninguno | +| **.password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | +| [](../API/POP3TransporterClass.md#port)
    | 995 | +| [](../API/POP3TransporterClass.md#user)
    | ninguno | ## Resultado From 44b9df40f2253c46a0771078ac12c9442cd3855f Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 05:48:35 +0200 Subject: [PATCH 72/99] New translations smtp-new-transporter.md (Spanish) --- .../version-21/commands/smtp-new-transporter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/smtp-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/smtp-new-transporter.md index 530879550701cd..d7f9ab0bc5a3d4 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands/smtp-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands/smtp-new-transporter.md @@ -47,7 +47,7 @@ En el parámetro *server*, pase un objeto que contenga las siguientes propiedade | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | | [](../API/SMTPTransporterClass.md#acceptunsecureconnection)
    | False | | .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[SMTP transporter](../API/SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | -| [](../API/SMTPTransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | +| [](../API/SMTPTransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | | [](../API/SMTPTransporterClass.md#bodycharset)
    | `mail mode UTF8` (US-ASCII_UTF8_QP) | | [](../API/SMTPTransporterClass.md#connectiontimeout)
    | 30 | | [](../API/SMTPTransporterClass.md#headercharset)
    | `mail mode UTF8` (US-ASCII_UTF8_QP) | From 08f47d211e12809d5a39b17da10785338345ace9 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:14:56 +0200 Subject: [PATCH 73/99] New translations imap-new-transporter.md (Spanish) --- .../commands/imap-new-transporter.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/imap-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/imap-new-transporter.md index dce455319860cf..aee7b4629d592d 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/imap-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/imap-new-transporter.md @@ -34,18 +34,18 @@ El comando `IMAP New transporter` ](../API/IMAPTransporterClass.md#acceptunsecureconnection)
    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | -| [](../API/IMAPTransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](../API/IMAPTransporterClass.md#checkconnectiondelay)
    | 300 | -| [](../API/IMAPTransporterClass.md#connectiontimeout)
    | 30 | -| [](../API/IMAPTransporterClass.md#host)
    | *obligatorio* | -| [](../API/IMAPTransporterClass.md#logfile)
    | ninguno | -| .**password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | -| [](../API/IMAPTransporterClass.md#port)
    | 993 | -| [](../API/IMAPTransporterClass.md#user)
    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](../API/IMAPTransporterClass.md#acceptunsecureconnection)
    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | +| [](../API/IMAPTransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | +| [](../API/IMAPTransporterClass.md#checkconnectiondelay)
    | 300 | +| [](../API/IMAPTransporterClass.md#connectiontimeout)
    | 30 | +| [](../API/IMAPTransporterClass.md#host)
    | *obligatorio* | +| [](../API/IMAPTransporterClass.md#logfile)
    | ninguno | +| .**password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[IMAP transporter](../API/IMAPTransporterClass.md#imap-transporter-object)*. | ninguno | +| [](../API/IMAPTransporterClass.md#port)
    | 993 | +| [](../API/IMAPTransporterClass.md#user)
    | ninguno | > **Atención**: asegúrese de que el tiempo de espera definido sea menor que el tiempo de espera del servidor, de lo contrario el tiempo de espera del cliente será inútil. From 1cb7628ef8ce732d9e9ed74a9573b2bdd32f6c65 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:15:59 +0200 Subject: [PATCH 74/99] New translations pop3-new-transporter.md (Spanish) --- .../commands/pop3-new-transporter.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/pop3-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/pop3-new-transporter.md index 08e00c57313831..e11511d22fd9bb 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/pop3-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/pop3-new-transporter.md @@ -34,17 +34,17 @@ El comando `POP3 New transporter` ](../API/POP3TransporterClass.md#acceptunsecureconnection)
    | False | -| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | -| [](../API/POP3TransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | -| [](../API/POP3TransporterClass.md#connectiontimeout)
    | 30 | -| [](../API/POP3TransporterClass.md#host)
    | *obligatorio* | -| [](../API/POP3TransporterClass.md#logfile)
    | ninguno | -| **.password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | -| [](../API/POP3TransporterClass.md#port)
    | 995 | -| [](../API/POP3TransporterClass.md#user)
    | ninguno | +| *server* | Valor por defecto (si se omite) | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [](../API/POP3TransporterClass.md#acceptunsecureconnection)
    | False | +| .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | +| [](../API/POP3TransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | +| [](../API/POP3TransporterClass.md#connectiontimeout)
    | 30 | +| [](../API/POP3TransporterClass.md#host)
    | *obligatorio* | +| [](../API/POP3TransporterClass.md#logfile)
    | ninguno | +| **.password** : Text
    contraseña de usuario para la autenticación en el servidor. No se devuelve en el objeto *[POP3 transporter](../API/POP3TransporterClass.md#pop3-transporter-object)*. | ninguno | +| [](../API/POP3TransporterClass.md#port)
    | 995 | +| [](../API/POP3TransporterClass.md#user)
    | ninguno | ## Resultado From 54e7183880b2a7429ef52783bafd10e0bf87f43d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:16:51 +0200 Subject: [PATCH 75/99] New translations smtp-new-transporter.md (Spanish) --- .../version-21-R2/commands/smtp-new-transporter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/smtp-new-transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/smtp-new-transporter.md index 530879550701cd..d7f9ab0bc5a3d4 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/smtp-new-transporter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands/smtp-new-transporter.md @@ -47,7 +47,7 @@ En el parámetro *server*, pase un objeto que contenga las siguientes propiedade | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | | [](../API/SMTPTransporterClass.md#acceptunsecureconnection)
    | False | | .**accessTokenOAuth2**: Text
    .**accessTokenOAuth2**: Object
    Cadena u objeto token que representa las credenciales de autorización OAuth2. Utilizado sólo con OAUTH2 `authationMode`. Si se utiliza `accessTokenOAuth2` pero se omite `authenticationMode`, se utiliza el protocolo OAuth 2 (si el servidor lo permite). No se devuelve en el objeto *[SMTP transporter](../API/SMTPTransporterClass.md#smtp-transporter-object)*. | ninguno | -| [](../API/SMTPTransporterClass.md#authenticationmode)
    | se utiliza el modo de autenticación más seguro soportado por el servidor | +| [](../API/SMTPTransporterClass.md#authenticationmode)
    | the most secure authentication mode supported by the server is used | | [](../API/SMTPTransporterClass.md#bodycharset)
    | `mail mode UTF8` (US-ASCII_UTF8_QP) | | [](../API/SMTPTransporterClass.md#connectiontimeout)
    | 30 | | [](../API/SMTPTransporterClass.md#headercharset)
    | `mail mode UTF8` (US-ASCII_UTF8_QP) | From 06367c0b0d48fbd367bc0d0e41dfb4823d73028d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:31 +0200 Subject: [PATCH 76/99] New translations openaiproviders.md (French) --- .../current/aikit/Classes/OpenAIProviders.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md new file mode 100644 index 00000000000000..4e714401f5c59c --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md @@ -0,0 +1,186 @@ +--- +id: openaiproviders +title: OpenAIProviders +--- + +# OpenAIProviders + +## Sommaire + +The `OpenAIProviders` class manages AI provider configurations by loading configuration and handling resolution of model strings in the `provider:model` format. + +For complete usage documentation, see [Provider Model Aliases](../provider-model-aliases.md). + +## Description + +This class enables multi-provider support by: + +- Loading provider configurations from a single JSON file +- Loading named model aliases that map to providers and model IDs +- Resolving `provider:model` syntax to full API configurations +- Resolving named model aliases by bare name to full provider + model configurations + +The `OpenAI` class automatically loads provider configurations when instantiated. + +## Constructeur + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +``` + +Creates a new instance that loads provider configuration from the `AIProviders.json` file (see [**Configuration Files**](../provider-model-aliases.md#configuration-files) in the "Provider Model Aliases" page for details on file locations and format). + +**Important:** + +- Only the first existing file is loaded. There is no merging of multiple files. +- The configuration is read once at instantiation time. If the `AIProviders.json` file is modified afterward, those changes will not be reflected in the existing instance. You must create a new instance of `OpenAIProviders` to reload the updated configuration. + +## Utilisation + +### Integration with OpenAI Class + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use model aliases with provider:model syntax +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) +``` + +### Direct Provider Access + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() + +// Get a specific provider configuration +var $config := $providers.get("openai") +// Returns: {baseURL: "...", apiKey: "...", modelAliases: [...], ...} or Null + +// Get all provider names +var $names := $providers.list() +// Returns: ["openai", "anthropic", "mistral", "local"] +``` + +## Fonctions + +### get() + +**get**(*name* : Text) : Object + +Get a provider configuration by name. + +| Paramètres | Type | Description | +| ---------- | ------ | ----------------------------------------------------- | +| *name* | Text | The provider name | +| Résultat | Object | Provider configuration object, or `Null` if not found | + +#### Exemple + +```4d +var $config := $providers.get("openai") +If ($config # Null) + // Use $config.baseURL, $config.apiKey, etc. + + // We could build a client with it + var $client:=cs.AIKit.OpenAI.new($config) +End if +``` + +### list() + +**list**() : Collection + +Get all provider names. + +| Paramètres | Type | Description | +| ---------- | ---------- | ---------------------------- | +| Résultat | Collection | Collection of provider names | + +#### Exemple + +```4d +var $names := $providers.list() +// Returns: ["openai", "anthropic", ...] + +For each ($name; $names) + var $config := $providers.get($name) +End for each +``` + +### modelAliases() + +**modelAliases**() : Collection + +Get all configured model aliases. + +| Paramètres | Type | Description | +| ---------- | ---------- | --------------------------------- | +| Résultat | Collection | Collection of model alias objects | + +Each object in the collection contains: + +| Propriété | Type | Description | +| ------------- | ---- | --------------------------------- | +| `name` | Text | Model alias name | +| `fournisseur` | Text | Provider name | +| `model` | Text | Model ID to use with the provider | + +#### Exemple + +```4d +var $models := $providers.modelAliases() +// Returns: [{name: "my-gpt", provider: "openai", model: "gpt-5.1"}, ...] + +For each ($model; $models) + // $m.name, $m.provider, $m.model +End for each +``` + +## Model Resolution + +Two syntaxes are supported for model resolution: + +### Provider alias (`provider:model`) + +Specify the provider and model name directly: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +``` + +This is resolved internally to: + +1. Split `"openai:gpt-5.1"` into provider=`"openai"` and model=`"gpt-5.1"` +2. Look up the `"openai"` provider configuration +3. Extract `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Exemples :** + +- `"openai:gpt-5.1"` → Use OpenAI provider with gpt-5.1 model +- `"anthropic:claude-3-opus"` → Use Anthropic provider with claude-3-opus +- `"local:llama3"` → Use local provider with llama3 model + +### Model alias (bare name) + +Use a named model by its bare name from the `models` section of the configuration: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: ":my-gpt"}) +``` + +This is resolved internally to: + +1. Look up `"my-gpt"` in the `models` configuration +2. Find its `provider` (e.g., `"openai"`) and `model` (e.g., `"gpt-5.1"`) +3. Resolve the provider to get `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Exemples :** + +- `"my-gpt"` → Use the model alias "my-gpt" (resolves to its configured provider and model) +- `"my-embedding"` → Use the model alias "my-embedding" for embedding operations + From 90fac492eb01f3b8a31a0a4322484ba678f4548b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:33 +0200 Subject: [PATCH 77/99] New translations provider-model-aliases.md (French) --- .../current/aikit/provider-model-aliases.md | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md new file mode 100644 index 00000000000000..15dc100e3b12ba --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md @@ -0,0 +1,372 @@ +--- +id: provider-model-aliases +title: Provider & Model Aliases +--- + +# Provider & Model Aliases + +The OpenAI client supports provider and model aliases, allowing you to define provider configurations and named model aliases in JSON files and reference them using simple syntaxes. + +## Vue d’ensemble + +Instead of hard-coding API endpoints and credentials in your code, you can: + +- Define provider configurations in a JSON file +- Use the `provider:model` syntax to specify a provider and model directly +- Define named model aliases that map to a provider and a model ID +- Use a named model alias by bare name (e.g., `my-gpt`) +- Switch between providers (OpenAI, Anthropic, local Ollama, etc.) easily + +## Configuration Files + +The client automatically loads provider configurations from the first existing file found (in priority order): + +| Priorité | Emplacement | File Path | +| ------------------------------------- | ----------- | ------------------------------------------------- | +| 1 (le plus élevé) | userData | `/Settings/AIProviders.json` | +| 2 | user | `/Settings/AIProviders.json` | +| 3 (le plus faible) | structure | `/SOURCES/AIProviders.json` | + +**Important:** Only the **first existing file** is loaded. There is no merging of multiple files. + +### Configuration File Format + +```json +{ + "providers": { + "provider_name": { + "baseURL": "https://api.example.com/v1", + "apiKey": "optional-key", + "organization": "optional-org-id", + "project": "optional-project-id" + } + }, + "models": { + "model_alias_name": { + "provider": "provider_name", + "model": "actual-model-id", + } + } +} +``` + +### Provider Fields + +| Champ | Type | Obligatoire | Description | +| -------------- | ---- | ----------- | -------------------------------------------------------------- | +| `baseURL` | Text | Oui | API endpoint URL | +| `apiKey` | Text | Non | API key value | +| `organisation` | Text | Non | Organization ID (optional, OpenAI-specific) | +| `project` | Text | Non | Project ID (optional, OpenAI-specific) | + +### Model Alias Fields + +| Champ | Type | Obligatoire | Description | +| ------------- | ---- | ----------- | ------------------------------------------------------------------- | +| `fournisseur` | Text | Oui | Name of the provider (must exist in `providers`) | +| `model` | Text | Oui | Model ID used by the provider | + +### Example Configuration + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1" + }, + "local": { + "baseURL": "http://localhost:11434/v1" + }, + "mistral": { + "baseURL": "https://api.mistral.ai/v1", + "apiKey": "your-mistral-key" + } + }, + "models": { + "my-gpt": { + "provider": "openai", + "model": "gpt-5.1" + }, + "my-claude": { + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022" + }, + "my-embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } + } +} +``` + +## Usage in API Calls + +### Model Parameter Formats + +Two syntaxes are supported: + +| Syntaxe | Description | +| --------------------- | ---------------------------------------------------------------------------------- | +| `provider:model_name` | Provider alias — specify provider and model directly | +| `:model_alias` | Model alias — reference a named model from the `models` configuration by bare name | + +#### Provider alias syntax + +Use the `provider:model_name` syntax in any API call that accepts a model parameter: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Chat completions +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) + +// Embeddings +var $result := $client.embeddings.create("text"; "openai:text-embedding-3-small") +var $result := $client.embeddings.create("text"; "local:nomic-embed-text") + +// Image generation +var $result := $client.images.generate("prompt"; {model: "openai:dall-e-3"}) +``` + +#### Model alias syntax + +Use a bare model name to reference a named model defined in the `models` section of the configuration file. The provider, model ID, and credentials are resolved automatically: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use a named model alias +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) +var $result := $client.chat.completions.create($messages; {model: ":my-claude"}) + +// Embeddings with a named model alias +var $result := $client.embeddings.create("text"; ":my-embedding") +``` + +### How It Works + +#### Provider alias (`provider:model`) + +When you use the `provider:model` syntax, the client automatically: + +1. **Parses** the model string to extract provider name and model name + - Example: `"openai:gpt-5.1"` → provider=`"openai"`, model=`"gpt-5.1"` + +2. **Looks up** the provider configuration from the loaded JSON file + - Retrieves `baseURL`, `apiKey`, `organization`, `project` + +3. **Makes the API request** using the resolved configuration + - Sends request to the provider's `baseURL` with the correct `apiKey` + +#### Model alias (bare name) + +When you use a bare model name that matches a configured alias, the client automatically: + +1. **Looks up** the model alias in the `models` section of the configuration + - Example: `":my-gpt"` → finds entry with `provider: "openai"`, `model: "gpt-5.1"` + +2. **Resolves** the associated provider to get `baseURL` and `apiKey` + +3. **Makes the API request** using the provider's endpoint and the stored model ID + +### Using Plain Model Names + +If you specify a model name **without** a provider prefix or `:` prefix, the client uses the configuration from its constructor: + +```4d +// Use constructor configuration +var $client := cs.AIKit.OpenAI.new({apiKey: "sk-..."; baseURL: "https://api.openai.com/v1"}) +var $result := $client.chat.completions.create($messages; {model: "gpt-5.1"}) + +// Override with provider alias +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) + +// Override with model alias (bare name) +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) + +``` + +## Exemples + +### Multi-Provider Chat Application + +```4d +var $client := cs.AIKit.OpenAI.new() +var $messages := [] +$messages.push({role: "user"; content: "What is the capital of France?"}) + +// Try OpenAI +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) + +// Try Anthropic +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-5-sonnet"}) + +// Try local Ollama +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Embeddings with Multiple Providers + +```4d +var $client := cs.AIKit.OpenAI.new() +var $text := "Hello world" + +// Use OpenAI embeddings +var $embedding1 := $client.embeddings.create($text; "openai:text-embedding-3-small") + +// Use local embeddings +var $embedding2 := $client.embeddings.create($text; "local:nomic-embed-text") +``` + +## Configuration Management + +Provider configurations can be managed through [4D Settings](https://developer.4d.com/docs/settings/ai) or by directly editing JSON files. + +**To add or modify providers:** + +1. Use 4D Settings interface (recommended), or +2. Edit the appropriate JSON file (userData, user, or structure) +3. Restart your application or create a new OpenAI client instance to load changes + +**Recommended file location:** + +- **For user-specific configs:** `/Settings/AIProviders.json` +- **For application defaults:** `/SOURCES/AIProviders.json` + +### No Reload Capability + +Once a client is instantiated, it cannot reload provider configurations. To pick up configuration changes: + +```4d +// Configuration changed - create new client +var $client := cs.AIKit.OpenAI.new() +``` + +## Security Considerations + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API tokens and credentials from exposure to client machines. + +## Common Use Cases + +### Local Development with Ollama + +```json +{ + "providers": { + "local": { + "baseURL": "http://localhost:11434/v1" + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Named Model Aliases + +Define models once, use them everywhere by name: + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + } + }, + "models": { + "chat": { + "provider": "openai", + "model": "gpt-5.1" + }, + "fast": { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022" + }, + "embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use named model aliases — no need to remember provider or model ID +var $result := $client.chat.completions.create($messages; {model: ":chat"}) +var $result := $client.chat.completions.create($messages; {model: ":fast"}) +var $embedding := $client.embeddings.create("text"; ":embedding") +``` + +### List All Configured Models + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +var $models := $providers.modelAliases() +// Returns: [{name: "chat", provider: "openai", model: "gpt-5.1"}, ...] +``` + +### Production with Multiple Cloud Providers + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + }, + "azure": { + "baseURL": "https://your-resource.openai.azure.com", + "apiKey": "your-azure-key" + } + } +} +``` + +### Provider-Specific Organizations + +```json +{ + "providers": { + "openai-team-a": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-a-id" + }, + "openai-team-b": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-b-id" + } + } +} +``` + +```4d +// Route to different organizations +var $resultA := $client.chat.completions.create($messages; {model: "openai-team-a:gpt-5.1"}) +var $resultB := $client.chat.completions.create($messages; {model: "openai-team-b:gpt-5.1"}) +``` + +## Related Documentation + +- [OpenAI Class](Classes/OpenAI.md) - Main client class +- [OpenAIProviders Class](Classes/OpenAIProviders.md) - Provider configuration management +- [Compatible OpenAI APIs](compatible-openai.md) - List of compatible providers From 2fca423eeb799dcaa89cd2ddda56058e61ba7d1d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:34 +0200 Subject: [PATCH 78/99] New translations ai-base-url.png (French) --- .../current/assets/en/settings/ai-base-url.png | Bin 0 -> 9244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png b/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd536326bf335e0726c4f2380311e2df0de08b1 GIT binary patch literal 9244 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 Date: Fri, 17 Apr 2026 08:30:35 +0200 Subject: [PATCH 79/99] New translations ai-connection-ok.png (French) --- .../assets/en/settings/ai-connection-ok.png | Bin 0 -> 2082 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png b/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..132fcb58c1e5fc4a554655d4fe52fccb741d81bf GIT binary patch literal 2082 zcmV+-2;KLIP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2e(N?K~#8N?c7gD z8|fd%@%K8V2M=v3X(^=@LqL#HN{RXpbI_rpcFxn1tYnIg&r0bZ?XxLKtPHf zJT6qBcnO9C!GjozNI?i`V<`y1&i2rQIQDm#nPlckthUrK{q_3-L7(~eMDl!|@AKH^ zH(l4iAcXkkb*K$Oh+mV0fe->D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb*NMAcU|< z7ziN%_|40Ij(mK4Os!Vq=;(-(lN0r@_`y0mJL&4`;>wjP>LDSTcoqi7$H#p5@PV5* zZ{qj+>FAK6dT1)dGaK*7%5W3 zG>u5BI=kr_lWU0*S)hJpK7p3VJC3`rN#ye+?CV_X8ArQP@;jduStyfFXv9*GirLRr zsvB3IofU+2UOv&{*bnk(gz3sC!|Q6nTVZK&n5F7zKNm^X%kxHiWqr6s$?h)clXm6d zT%On^cXf$jWyw-mA8ye3)T*HP(noT;(ck2@v!Bk_r1W1Y@ry4VuR(q5wR$Zs zr~D2sNt=d2nT5zxcwsFej2y(wfs%hdMSsq2pC?L`c_T-hI61?h&{SvVN%SrE-7LwW9G43oYXT%ko^#0=4MMgsfNDc zOJ`@-@{Z{??xm{z_GlDZFB2R!4uFrd04TO$L2dr}PkJO6HKStPi{UAAwP8U{}_M z8P(JEVZOjV`CyX`4{ojN@He@=j!_w(XluiyZiNX<2f@> zAj(*LgWY|gTxQFvPBcwJ>z!g_W0!r(|={>Z{&-hR=JzDLK1 zZ|u_O-H&3gzgMAfjzFjuStiYt@`f(%XPACq4(f*Yy!p7v%)j=mI7)^Rm1=;1Zsxv@-m^O=ekWttYGO55Mr7?t@{P8hwA6N{{-nF$9*16 zk!G1vTKlFN&%}?*`yO{ia479AkE=QY&0p=Uto@EUK!`fU6 zP8KkX7x2_wzMrOC-eU0nJ+=8_I5t2VRmeWO8~p^;g5{?XW-c;KX8(-+@7fzSeF0_g zRjB9#^!Z(lmg&X@rK6Gv|E{CYj_}G+S_g*K&}TES-dv`)R-sr8F>;|ZZH0=iwz&;F zEID4ET@^WWkFz$blVSQBDzJ;wreSc8`-AS%+%3pt!7Sfb&Pan`bONTHDwRZ#V1J63 zV_8sMct$EdX3hBDAsD28V~XcZ{fRObcR%Y)_wFlw&hvZf3yx+`wZ?kbbxR-%&e>H<-7FV$nf{6Goranv1eeDS*ffBGQ6_Z_ovRN z)gsIEaaV2s4tK99{ol?q!xO^Y)@!qt6Ija`dzlcp9%A!#_8h@wh241q_ky))7zCLt zY|Vg1vA1d!{1F{9cx= zSfhXT=A!y6yN}VaxMKs+p{dU?$a(l@$4682?KC#FLe(dftXVA_O2cb&FTuC|hR_ZB zqA+vT+S|O&Eb9Y9YpnWa2-zEHFN@Z|UL|DTr(Oj(H`GEbcV`&yc5l*+vU>K~x@DE} zeVY1TfK_WRBQTU9tv8keudX$g2|Svk^svOJeO;@W-?_n9fK|0}@R(=+h57B)_8 zKy4Nt*xA{kr>9447Q&@XD+3{f*E|b@j*bot!%&;W1(V;oI4{q_;Of<@@*x|S;N!=S zbar;C%|bNsEDY>V+^N-SGFy4TFbob34mdbCpsTA(JuE~M&o&UTJ_qsLyLTKO9`faj zXOI0QX`06M>(}Y&>5D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb)Dy58p?k)fiB|0ssI2 M07*qoM6N<$f(qCA!vFvP literal 0 HcmV?d00001 From 7d276e481d24ddb462b83ff22da43d344ade82ef Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:36 +0200 Subject: [PATCH 80/99] New translations model-alias.png (French) --- .../current/assets/en/settings/model-alias.png | Bin 0 -> 46721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png b/i18n/fr/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png new file mode 100644 index 0000000000000000000000000000000000000000..7af048330e16aa44a41982ff4f3cc23807254183 GIT binary patch literal 46721 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 Date: Fri, 17 Apr 2026 08:30:38 +0200 Subject: [PATCH 81/99] New translations ai.md (French) --- .../current/settings/ai.md | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/settings/ai.md diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/settings/ai.md b/i18n/fr/docusaurus-plugin-content-docs/current/settings/ai.md new file mode 100644 index 00000000000000..7920137b590933 --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/settings/ai.md @@ -0,0 +1,140 @@ +--- +id: ai +title: AI page +--- + +The AI page allows you to add, remove, or view the list of all your AI providers and their related model aliases, whether they come from local sources or internet-based services. Providers and model aliases can then be used in your code througout your 4D application, especially with the [**4D-AIKit component**](../aikit/overview.md) using the [**model aliases**](../aikit/provider-model-aliases.md) feature. + +:::tip Article(s) de blog sur le sujet + +[Centralizing AI Providers and Model Aliases in 4D](https://blog.4d.com/centralizing-ai-providers-and-model-aliases-in-4d) + +::: + +## Managing providers + +4D supports [various AI providers](../aikit/compatible-openai.md) with an OpenAI-like API, each offering unique models and features for database needs. + +By default, the Providers list is empty. + +### Adding a provider + +To add an AI provider: + +1. Click on the **+** button at the bottom of the Providers list. +2. Enter the required [provider's configuration fields](#provider-properties), including credentials. +3. (optional) Click the **Test connection** button to make sure the provided URL and credentials are valid. + +If the connection is successful, the number of available models is displayed on the right side of the button: + +![](../assets/en/settings/ai-connection-ok.png) + +If the connection test fails, an error message is displayed (e.g. "Request failed: Not found" or "Request failed: Unauthorized"). + +4. Click **OK** to save the new provider, or **Cancel** to revert all modifications. + +### Editing a provider + +To edit or remove a provider: + +1. Select a registered provider in the list. +2. Edit the provider's information OR to remove a provider, click on the **-** button at the bottom of the Providers list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +## Provider properties + +When you select a provider in the Providers list, several properties are available. Property names in **bold** are mandatory to create a Provider. + +### Nom + +Local name used to identify the provider in your code, for example "claude". The name must be [compliant with property names](../Concepts/identifiers.md) since it will be used in the application's code to reference the provider. + +### Base URL + +Endpoint of the provider's API, for example `https://api.openai.com/v1` or `http://localhost:11434/v1`. + +The combo box lists the main providers, you can select a value to enter the provider endpoint: + +![](../assets/en/settings/ai-base-url.png) + +### API Key + +(optional) API key for the provider. For instructions on generating an API key, please refer to your AI provider’s official documentation. Some AI providers may also require additional specific credentials. + +### Organisation + +(optional, OpenAI-specific) Organization ID used by the OpenAI API. + +### Project + +(optional, OpenAI-specific) ID of the project. Each OpenAI API key is attached to a project. + +### AIProviders.json + +The provider configuration is stored in a JSON file named *AIProviders.json* located next to the active *settings.4DSettings file* within the [project folder](../Project/architecture.md), [depending on your deployment configuration](./overview.md#enabling-user-settings). + +### Deployment with an API key + +When configuring an AI provider, you need to provide your own API key. It requires an external registration for getting API keys/credentials from AI providers. + +Using the Settings dialog box, the 4D developer can define a custom **provider name** (for example "open-ai-v1") and use this custom name in the code. They can also test it using their API key. + +When the 4D application is deployed with the [User settings enabled](../settings/overview.md#enabling-user-settings), the administrator can configure the User settings by using the **same AI provider name** ("open-ai-v1") and **customize the API key** to use the customer's key. Thanks to the [User settings priority rules](../settings/overview.md#priority-of-settings), the customer settings will automatically override the developer settings. + +:::warning + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API keys and credentials from exposure to remote machines. + +::: + +## Model Aliases + +The Model Aliases page allows you to list models from registered Providers that you want to use in your code and to name them with *aliases*. Thanks to model aliases, you avoid hardcoding model names, switch models without changing your code, and keep consistency across environments. + +When using a model alias: + +- The provider is automatically resolved (see [Model resolution](../aikit/Classes/OpenAIProviders.md#model-resolution) in the 4D-AIKit documentation). +- The model ID is applied. +- All credentials and endpoints are used. + +### Adding a model alias + +:::note + +To be able to add a model alias, you must have entered at least one valid provider in the **Providers** tab. + +::: + +To add a model alias: + +1. Click on the **+** button at the bottom of the model aliases list. +2. In the **Name** column, enter the name of the alias. +3. Click on the corresponding row in the **Provider** column to display the list of available providers ([provider names](#name) you entered in the Providers page), and select the name of the provider. +4. Click on the corresponding row in the **Model** column to display the list of available models exposed by the selected provider and select the model. +5. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +![](../assets/en/settings/model-alias.png) + +### Editing a model alias + +To edit or remove an alias: + +1. Select a model alias in the list. +2. Edit the alias information OR to remove a alias, click on the **-** button at the bottom of the list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +### Using a model alias + +You can directly use the model alias name wherever a model name is required (provided that model aliases are supported). + +For example, in 4D-AIKit, you can reference a model with the syntax: *{model:"ModelName"}*, where *ModelName* is a valid model defined in the Model Aliases tab: + +```4d +var $client:=cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; \ + {model: "Chat Model"}) +``` + +### Voir également + +["Provider & Model Aliases"](../aikit/provider-model-aliases.md) in the 4D AIKit documentation. \ No newline at end of file From c53afcf696f486e03e24bf0ff0f573ed8dbf6dd1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:46 +0200 Subject: [PATCH 82/99] New translations openaiproviders.md (Spanish) --- .../current/aikit/Classes/OpenAIProviders.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md new file mode 100644 index 00000000000000..39879bb87dea61 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md @@ -0,0 +1,186 @@ +--- +id: openaiproviders +title: OpenAIProviders +--- + +# OpenAIProviders + +## Resumen + +The `OpenAIProviders` class manages AI provider configurations by loading configuration and handling resolution of model strings in the `provider:model` format. + +For complete usage documentation, see [Provider Model Aliases](../provider-model-aliases.md). + +## Descripción + +This class enables multi-provider support by: + +- Loading provider configurations from a single JSON file +- Loading named model aliases that map to providers and model IDs +- Resolving `provider:model` syntax to full API configurations +- Resolving named model aliases by bare name to full provider + model configurations + +The `OpenAI` class automatically loads provider configurations when instantiated. + +## Constructor + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +``` + +Creates a new instance that loads provider configuration from the `AIProviders.json` file (see [**Configuration Files**](../provider-model-aliases.md#configuration-files) in the "Provider Model Aliases" page for details on file locations and format). + +**Important:** + +- Only the first existing file is loaded. There is no merging of multiple files. +- The configuration is read once at instantiation time. If the `AIProviders.json` file is modified afterward, those changes will not be reflected in the existing instance. You must create a new instance of `OpenAIProviders` to reload the updated configuration. + +## Utilización + +### Integration with OpenAI Class + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use model aliases with provider:model syntax +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) +``` + +### Direct Provider Access + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() + +// Get a specific provider configuration +var $config := $providers.get("openai") +// Returns: {baseURL: "...", apiKey: "...", modelAliases: [...], ...} or Null + +// Get all provider names +var $names := $providers.list() +// Returns: ["openai", "anthropic", "mistral", "local"] +``` + +## Funciones + +### get() + +**get**(*name* : Text) : Object + +Get a provider configuration by name. + +| Parámetros | Tipo | Descripción | +| ---------- | ------ | ----------------------------------------------------- | +| *name* | Text | The provider name | +| Resultado | Object | Provider configuration object, or `Null` if not found | + +#### Ejemplo + +```4d +var $config := $providers.get("openai") +If ($config # Null) + // Use $config.baseURL, $config.apiKey, etc. + + // We could build a client with it + var $client:=cs.AIKit.OpenAI.new($config) +End if +``` + +### lista() + +**list**() : Collection + +Get all provider names. + +| Parámetros | Tipo | Descripción | +| ---------- | ---------- | ---------------------------- | +| Resultado | Collection | Collection of provider names | + +#### Ejemplo + +```4d +var $names := $providers.list() +// Returns: ["openai", "anthropic", ...] + +For each ($name; $names) + var $config := $providers.get($name) +End for each +``` + +### modelAliases() + +**modelAliases**() : Collection + +Get all configured model aliases. + +| Parámetros | Tipo | Descripción | +| ---------- | ---------- | --------------------------------- | +| Resultado | Collection | Collection of model alias objects | + +Each object in the collection contains: + +| Propiedad | Tipo | Descripción | +| ----------- | ---- | --------------------------------- | +| `name` | Text | Model alias name | +| `proveedor` | Text | Provider name | +| `model` | Text | Model ID to use with the provider | + +#### Ejemplo + +```4d +var $models := $providers.modelAliases() +// Returns: [{name: "my-gpt", provider: "openai", model: "gpt-5.1"}, ...] + +For each ($model; $models) + // $m.name, $m.provider, $m.model +End for each +``` + +## Model Resolution + +Two syntaxes are supported for model resolution: + +### Provider alias (`provider:model`) + +Specify the provider and model name directly: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +``` + +This is resolved internally to: + +1. Split `"openai:gpt-5.1"` into provider=`"openai"` and model=`"gpt-5.1"` +2. Look up the `"openai"` provider configuration +3. Extract `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Ejemplos:** + +- `"openai:gpt-5.1"` → Use OpenAI provider with gpt-5.1 model +- `"anthropic:claude-3-opus"` → Use Anthropic provider with claude-3-opus +- `"local:llama3"` → Use local provider with llama3 model + +### Model alias (bare name) + +Use a named model by its bare name from the `models` section of the configuration: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: ":my-gpt"}) +``` + +This is resolved internally to: + +1. Look up `"my-gpt"` in the `models` configuration +2. Find its `provider` (e.g., `"openai"`) and `model` (e.g., `"gpt-5.1"`) +3. Resolve the provider to get `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Ejemplos:** + +- `"my-gpt"` → Use the model alias "my-gpt" (resolves to its configured provider and model) +- `"my-embedding"` → Use the model alias "my-embedding" for embedding operations + From 4758e9184930b101597f97b4d96d425321f60f93 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:48 +0200 Subject: [PATCH 83/99] New translations provider-model-aliases.md (Spanish) --- .../current/aikit/provider-model-aliases.md | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md new file mode 100644 index 00000000000000..20da20c51e3ae0 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md @@ -0,0 +1,372 @@ +--- +id: provider-model-aliases +title: Provider & Model Aliases +--- + +# Provider & Model Aliases + +The OpenAI client supports provider and model aliases, allowing you to define provider configurations and named model aliases in JSON files and reference them using simple syntaxes. + +## Generalidades + +Instead of hard-coding API endpoints and credentials in your code, you can: + +- Define provider configurations in a JSON file +- Use the `provider:model` syntax to specify a provider and model directly +- Define named model aliases that map to a provider and a model ID +- Use a named model alias by bare name (e.g., `my-gpt`) +- Switch between providers (OpenAI, Anthropic, local Ollama, etc.) easily + +## Configuration Files + +The client automatically loads provider configurations from the first existing file found (in priority order): + +| Prioridad | Ubicación | File Path | +| ---------------------------------- | --------- | ------------------------------------------------- | +| 1 (el mayor) | userData | `/Settings/AIProviders.json` | +| 2 | user | `/Settings/AIProviders.json` | +| 3 (el más bajo) | structure | `/SOURCES/AIProviders.json` | + +**Important:** Only the **first existing file** is loaded. There is no merging of multiple files. + +### Configuration File Format + +```json +{ + "providers": { + "provider_name": { + "baseURL": "https://api.example.com/v1", + "apiKey": "optional-key", + "organization": "optional-org-id", + "project": "optional-project-id" + } + }, + "models": { + "model_alias_name": { + "provider": "provider_name", + "model": "actual-model-id", + } + } +} +``` + +### Provider Fields + +| Campo | Tipo | Requerido | Descripción | +| -------------- | ---- | --------- | -------------------------------------------------------------- | +| `baseURL` | Text | Sí | API endpoint URL | +| `apiKey` | Text | No | API key value | +| `organization` | Text | No | Organization ID (optional, OpenAI-specific) | +| `project` | Text | No | Project ID (optional, OpenAI-specific) | + +### Model Alias Fields + +| Campo | Tipo | Requerido | Descripción | +| ----------- | ---- | --------- | ------------------------------------------------------------------- | +| `proveedor` | Text | Sí | Name of the provider (must exist in `providers`) | +| `model` | Text | Sí | Model ID used by the provider | + +### Example Configuration + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1" + }, + "local": { + "baseURL": "http://localhost:11434/v1" + }, + "mistral": { + "baseURL": "https://api.mistral.ai/v1", + "apiKey": "your-mistral-key" + } + }, + "models": { + "my-gpt": { + "provider": "openai", + "model": "gpt-5.1" + }, + "my-claude": { + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022" + }, + "my-embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } + } +} +``` + +## Usage in API Calls + +### Model Parameter Formats + +Two syntaxes are supported: + +| Sintaxis | Descripción | +| --------------------- | ---------------------------------------------------------------------------------- | +| `provider:model_name` | Provider alias — specify provider and model directly | +| `:model_alias` | Model alias — reference a named model from the `models` configuration by bare name | + +#### Provider alias syntax + +Use the `provider:model_name` syntax in any API call that accepts a model parameter: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Chat completions +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) + +// Embeddings +var $result := $client.embeddings.create("text"; "openai:text-embedding-3-small") +var $result := $client.embeddings.create("text"; "local:nomic-embed-text") + +// Image generation +var $result := $client.images.generate("prompt"; {model: "openai:dall-e-3"}) +``` + +#### Model alias syntax + +Use a bare model name to reference a named model defined in the `models` section of the configuration file. The provider, model ID, and credentials are resolved automatically: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use a named model alias +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) +var $result := $client.chat.completions.create($messages; {model: ":my-claude"}) + +// Embeddings with a named model alias +var $result := $client.embeddings.create("text"; ":my-embedding") +``` + +### How It Works + +#### Provider alias (`provider:model`) + +When you use the `provider:model` syntax, the client automatically: + +1. **Parses** the model string to extract provider name and model name + - Example: `"openai:gpt-5.1"` → provider=`"openai"`, model=`"gpt-5.1"` + +2. **Looks up** the provider configuration from the loaded JSON file + - Retrieves `baseURL`, `apiKey`, `organization`, `project` + +3. **Makes the API request** using the resolved configuration + - Sends request to the provider's `baseURL` with the correct `apiKey` + +#### Model alias (bare name) + +When you use a bare model name that matches a configured alias, the client automatically: + +1. **Looks up** the model alias in the `models` section of the configuration + - Example: `":my-gpt"` → finds entry with `provider: "openai"`, `model: "gpt-5.1"` + +2. **Resolves** the associated provider to get `baseURL` and `apiKey` + +3. **Makes the API request** using the provider's endpoint and the stored model ID + +### Using Plain Model Names + +If you specify a model name **without** a provider prefix or `:` prefix, the client uses the configuration from its constructor: + +```4d +// Use constructor configuration +var $client := cs.AIKit.OpenAI.new({apiKey: "sk-..."; baseURL: "https://api.openai.com/v1"}) +var $result := $client.chat.completions.create($messages; {model: "gpt-5.1"}) + +// Override with provider alias +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) + +// Override with model alias (bare name) +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) + +``` + +## Ejemplos + +### Multi-Provider Chat Application + +```4d +var $client := cs.AIKit.OpenAI.new() +var $messages := [] +$messages.push({role: "user"; content: "What is the capital of France?"}) + +// Try OpenAI +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) + +// Try Anthropic +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-5-sonnet"}) + +// Try local Ollama +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Embeddings with Multiple Providers + +```4d +var $client := cs.AIKit.OpenAI.new() +var $text := "Hello world" + +// Use OpenAI embeddings +var $embedding1 := $client.embeddings.create($text; "openai:text-embedding-3-small") + +// Use local embeddings +var $embedding2 := $client.embeddings.create($text; "local:nomic-embed-text") +``` + +## Configuration Management + +Provider configurations can be managed through [4D Settings](https://developer.4d.com/docs/settings/ai) or by directly editing JSON files. + +**To add or modify providers:** + +1. Use 4D Settings interface (recommended), or +2. Edit the appropriate JSON file (userData, user, or structure) +3. Restart your application or create a new OpenAI client instance to load changes + +**Recommended file location:** + +- **For user-specific configs:** `/Settings/AIProviders.json` +- **For application defaults:** `/SOURCES/AIProviders.json` + +### No Reload Capability + +Once a client is instantiated, it cannot reload provider configurations. To pick up configuration changes: + +```4d +// Configuration changed - create new client +var $client := cs.AIKit.OpenAI.new() +``` + +## Security Considerations + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API tokens and credentials from exposure to client machines. + +## Common Use Cases + +### Local Development with Ollama + +```json +{ + "providers": { + "local": { + "baseURL": "http://localhost:11434/v1" + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Named Model Aliases + +Define models once, use them everywhere by name: + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + } + }, + "models": { + "chat": { + "provider": "openai", + "model": "gpt-5.1" + }, + "fast": { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022" + }, + "embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use named model aliases — no need to remember provider or model ID +var $result := $client.chat.completions.create($messages; {model: ":chat"}) +var $result := $client.chat.completions.create($messages; {model: ":fast"}) +var $embedding := $client.embeddings.create("text"; ":embedding") +``` + +### List All Configured Models + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +var $models := $providers.modelAliases() +// Returns: [{name: "chat", provider: "openai", model: "gpt-5.1"}, ...] +``` + +### Production with Multiple Cloud Providers + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + }, + "azure": { + "baseURL": "https://your-resource.openai.azure.com", + "apiKey": "your-azure-key" + } + } +} +``` + +### Provider-Specific Organizations + +```json +{ + "providers": { + "openai-team-a": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-a-id" + }, + "openai-team-b": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-b-id" + } + } +} +``` + +```4d +// Route to different organizations +var $resultA := $client.chat.completions.create($messages; {model: "openai-team-a:gpt-5.1"}) +var $resultB := $client.chat.completions.create($messages; {model: "openai-team-b:gpt-5.1"}) +``` + +## Related Documentation + +- [OpenAI Class](Classes/OpenAI.md) - Main client class +- [OpenAIProviders Class](Classes/OpenAIProviders.md) - Provider configuration management +- [Compatible OpenAI APIs](compatible-openai.md) - List of compatible providers From 6c435d1ede24e3a7d4772dfd248d12a98fb953bf Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:49 +0200 Subject: [PATCH 84/99] New translations ai-base-url.png (Spanish) --- .../current/assets/en/settings/ai-base-url.png | Bin 0 -> 9244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd536326bf335e0726c4f2380311e2df0de08b1 GIT binary patch literal 9244 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 Date: Fri, 17 Apr 2026 08:30:50 +0200 Subject: [PATCH 85/99] New translations ai-connection-ok.png (Spanish) --- .../assets/en/settings/ai-connection-ok.png | Bin 0 -> 2082 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..132fcb58c1e5fc4a554655d4fe52fccb741d81bf GIT binary patch literal 2082 zcmV+-2;KLIP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2e(N?K~#8N?c7gD z8|fd%@%K8V2M=v3X(^=@LqL#HN{RXpbI_rpcFxn1tYnIg&r0bZ?XxLKtPHf zJT6qBcnO9C!GjozNI?i`V<`y1&i2rQIQDm#nPlckthUrK{q_3-L7(~eMDl!|@AKH^ zH(l4iAcXkkb*K$Oh+mV0fe->D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb*NMAcU|< z7ziN%_|40Ij(mK4Os!Vq=;(-(lN0r@_`y0mJL&4`;>wjP>LDSTcoqi7$H#p5@PV5* zZ{qj+>FAK6dT1)dGaK*7%5W3 zG>u5BI=kr_lWU0*S)hJpK7p3VJC3`rN#ye+?CV_X8ArQP@;jduStyfFXv9*GirLRr zsvB3IofU+2UOv&{*bnk(gz3sC!|Q6nTVZK&n5F7zKNm^X%kxHiWqr6s$?h)clXm6d zT%On^cXf$jWyw-mA8ye3)T*HP(noT;(ck2@v!Bk_r1W1Y@ry4VuR(q5wR$Zs zr~D2sNt=d2nT5zxcwsFej2y(wfs%hdMSsq2pC?L`c_T-hI61?h&{SvVN%SrE-7LwW9G43oYXT%ko^#0=4MMgsfNDc zOJ`@-@{Z{??xm{z_GlDZFB2R!4uFrd04TO$L2dr}PkJO6HKStPi{UAAwP8U{}_M z8P(JEVZOjV`CyX`4{ojN@He@=j!_w(XluiyZiNX<2f@> zAj(*LgWY|gTxQFvPBcwJ>z!g_W0!r(|={>Z{&-hR=JzDLK1 zZ|u_O-H&3gzgMAfjzFjuStiYt@`f(%XPACq4(f*Yy!p7v%)j=mI7)^Rm1=;1Zsxv@-m^O=ekWttYGO55Mr7?t@{P8hwA6N{{-nF$9*16 zk!G1vTKlFN&%}?*`yO{ia479AkE=QY&0p=Uto@EUK!`fU6 zP8KkX7x2_wzMrOC-eU0nJ+=8_I5t2VRmeWO8~p^;g5{?XW-c;KX8(-+@7fzSeF0_g zRjB9#^!Z(lmg&X@rK6Gv|E{CYj_}G+S_g*K&}TES-dv`)R-sr8F>;|ZZH0=iwz&;F zEID4ET@^WWkFz$blVSQBDzJ;wreSc8`-AS%+%3pt!7Sfb&Pan`bONTHDwRZ#V1J63 zV_8sMct$EdX3hBDAsD28V~XcZ{fRObcR%Y)_wFlw&hvZf3yx+`wZ?kbbxR-%&e>H<-7FV$nf{6Goranv1eeDS*ffBGQ6_Z_ovRN z)gsIEaaV2s4tK99{ol?q!xO^Y)@!qt6Ija`dzlcp9%A!#_8h@wh241q_ky))7zCLt zY|Vg1vA1d!{1F{9cx= zSfhXT=A!y6yN}VaxMKs+p{dU?$a(l@$4682?KC#FLe(dftXVA_O2cb&FTuC|hR_ZB zqA+vT+S|O&Eb9Y9YpnWa2-zEHFN@Z|UL|DTr(Oj(H`GEbcV`&yc5l*+vU>K~x@DE} zeVY1TfK_WRBQTU9tv8keudX$g2|Svk^svOJeO;@W-?_n9fK|0}@R(=+h57B)_8 zKy4Nt*xA{kr>9447Q&@XD+3{f*E|b@j*bot!%&;W1(V;oI4{q_;Of<@@*x|S;N!=S zbar;C%|bNsEDY>V+^N-SGFy4TFbob34mdbCpsTA(JuE~M&o&UTJ_qsLyLTKO9`faj zXOI0QX`06M>(}Y&>5D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb)Dy58p?k)fiB|0ssI2 M07*qoM6N<$f(qCA!vFvP literal 0 HcmV?d00001 From 34a4eb7dc547513607a8917acd3758dbb27ff41a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:30:51 +0200 Subject: [PATCH 86/99] New translations model-alias.png (Spanish) --- .../current/assets/en/settings/model-alias.png | Bin 0 -> 46721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png new file mode 100644 index 0000000000000000000000000000000000000000..7af048330e16aa44a41982ff4f3cc23807254183 GIT binary patch literal 46721 zcma&ObzD_z+dl|WqLiT0pokzU-7V6c($d}Cp&+G%Gzdruh=@oDNOyxsgLLPnJLcNw zedjkb|IPV4=ZNgJSKRj%-?-KjrlcT=dyDKA3JMCYw3L_%3JMzhh_ZSU6aK5|7kB}G zpgOBazC`)aN3jNfK{pqX7ePTOj=Ftehyj1cc97C?MnS=AM*fT1ZvWK;z7S%mrs<+7 zFUMzWZ_8w8VsB*1|rq}Sk-XOVXh zHMOvm@^Ug&^-@qX_OdqSHK7+4!o4Nn!3SrsHFYt3;9+ZH=gj9JNb}!``QT^dubF9t z1e{FF_*BFs{`Uy@n;?yai;DvvGqbz9JCi#*lf9EUGb=AIFEa}pGaDNt9Kq=9Y3E|- z!D#3F=zmWjX6kJ0Wa;2yX>a!cc|t=Ydsi1h8dq0K6FxITGfpED6HZ1WLv|BJR#p>3 zMne;JRz?$cb`x$+RvtDpRwJ7Ky}XO1+5dBWJLmsh23QbgYib8e>JDr7JTB=r3QAd^ zw3vvRhu-FtyARRIWy5aNQHe>nw>>#IOZTQ=6VAAF3P(1-?U`&!ABXK=JO{4)-}vFp z+D_U{Tr-b1jc+P;r@f^|>Sn0NZatxWiynyGe}4G)_IK~?FR?D}GYCQ1qY3LGX_Oe+ zhthtt^g` zp4B6qr&sj7w>Uew$An+AIS4WPtn8Q9bx3(JH|2#P%soQ;UlG&^^=a%l=HE%*=-`T} zOW!}$Q^4L6UeO;fD5`tv_-R%@hW4KwH&xV19Qv#e2Ik6!D-+#3JE_oo={+X#M{Dl> zLd+kVa^x>Yf}>7sgtvTr>GIHz*+_2%-Kf&tzC2fzZg^HyvzL$Fu;eu7^7|$WR@Ugo zfJNDpyYChCmYi|yT94OcQ%-m!1f+eW101CJrgBbQ%mWAGiI~*qCn?tYRC|2x@b2Tc zY`HBsjQ!Luba8jhQhTcWG(JxeMWL=4;lii<^p%)+J7MC-(DX+9LWPi*nF31~=pqE@ zb4G5+=hZZ(;e4$RCb%DXV1lW>sPL*~LyB-dFui?_~ z;UGBpYlni@&433tGls3gB4i&t<-4CZ7}mbW`_b z72e4`_yX~xLUmam9~v{~2X+;clZ*O7Lsziu2VRtZn8Guz7;r0wEwO!UKZR3DkcU4D zOsD3nZ6rs?#vDlBn02dGwl1@9<(oM~KD41`s{CNu+|y?_19n_{ z32#-s3_p4V_oz#tfA@QOFXee=iFs+{gPTpG(JwQ_GL<|Qe1kusV8cb4f@Zxj_+n`r z+|&B!b+$kJV!RpPz_7!G`dbOYAq0PEe+~0|e+ zMYpTd4&hYuWB?NGHx zQt>W%MzxFD+Tw=n;d`ZTtgkQr$wU*_ABxS36IAuTXtq!0w?`eFad>3h9=R|!kiAGP z(C{fr=u1JtV8w~n+Un};=W748^8<~e9#us`0)mF}(W!=jpbtDM4r3Le8pg(G*FGNi zYHMpzd`=p@Hz%qnLz+c0ct7UICK_`j`)ClMi}0BH1X|40*MFb8)mFcHi95P+E8s!6 znt2+^(CFyEzklz%9i9)c8&-_x7Zm1HS9iM)rshxs1BH`yo?v)m>VSJe!Nu7qnWu8eQG8$!xA&on#pMs`d?4#udS^a4z}U; zq<-%Ff^B>fB zv@Xk&qm0$tGap|rMI9U+?Tuw$FaJotd{^*8vk$_?W21L8ncJMtcrdo=x=wh(sY=0f z#&H+>Vj~@2`PHki=D7w7j(NB0@e)s>XNk;aHePJk?(O)Nww80}Gqv%!8>3E_2OS1Qk%C$ZB!X!^SDTNomJxgGH%A3GRT^mI!9hY#|d62uv z7|teqHE>+D{V85eEpBjRM8-icM!QlXa-w!?`|os5pOPhZ2XS~zxbsj#p>uLB^}Mbfwwb9)G;Y0jvAjLAyH{Y( zX4ph~v?<)Mx0JZxR^?EwIP@+xNqQVRM$Frr+$|*{N@yCT$<;%Ty;+1>L@*pAKP+!kyVk0l{naGtSHbcTU67jV_z59`nSKG z+P~$CbTY-WAG4pVf3$NMi0*lKT#e_QPElXAycKQtI7z>5rTugVJHP?6Px9y0E8l7B z540}`-pLMVJw~aMk(G7eqYx-tNB!)vDXgZUku_jZwS7kJv9iTI{?m_ATs)|*z&BS= ztGZbG`{q<^>yfPvHZHFD0d4tljszk}Lc?5UvtW}@f#=yiZzSxUL;our^K5-E07uvsz zU+9IB(i=Q=w01=#o4|BT_bN*G%$|>bg4bpBfqmW8Q#jyFZmtBT4cE-DP;6s=6tD9N z5jnY}&&wNIwzfPJc$nYOp6mU_dDE$yOGrwJ(U4lT-#J~M7$xKpC3=dbNXrgA;?bD7 z>!zSi-NyM9bcY?+1$mS{7mf#o>LJ~0O$)mO_wOs5tqurWEwa~KEmtG|?MdZKNwGiW z!WTHf=d#spuctc2lF1?b=)faXjq9gjPH$@Z_~5`LHYKI^>e736pZ%xphM5gLMx9w{ za(lYRr_mXo#CqWqmaD6)Y166Kuhm|?f~;jtzDO1{XL|MO)mKg{0V;f^<9vC05;@FN zJS;RcG|j^MWaMNYyO&N#BRDvQ21k#jRY_{6XA7g1p4_dRV)F9-ZTQo^C9E2e#|9_j zwdT4$MJyoiR^WQRpy%_xG`T?fx<| z?e#3`h+j?c>_-9`8XDy%cRd8Co_2LxSlNgb4F3K5uSe1U$hmH}*S^@JlkM-IWU2KE zo{Ea(9Wt`zb9Et81A{kEfjff_t;eg3`5``Z9hY7u^}e;4{GALjogBv-gg>p*J3Oiz zGGOsChW2P{viYb`hsR}=pjABRxxOPWc9=BsE)#mm$1B|Noq_`1y+arBxPHC9VTFx@ z)3ojI)9_Mz51%TdY*8#^3FG#CM+jt8Gj>bMwUblQ&d%}vAFuhxQp!{QrP{Pbq`#5K zMg=@s?7BfGbhhLB%YLTo%GbMUH#dcp-HqbjlBvx^+1t&_^RZ%I^6d6-@qD!s{~5i= zyA*V^wCFi1@Fd8!GyHdgU30x{Rp;7WNYN!6s$O7xae{qte7rk%j@a8m_@r-dGfjIV zDDkK|vdg}|TWEi#S!eW^cl=!IvQGy`6Du?<%=GV<&h&9LS-@R9X%z3$DU#BqKW^)6 z?{^_<_fsXV6uScQ_R}84H*Uj0RhsK@e(pJ zw>mrXzp6bAmw5E>VJ3P~Z%garpHM!+$>JrXq@GAicUqKdLl8+x@$A+?aIl=5BCnw0 z#D+W^6NA-w*(O&mS;9n(qw(RxmUemrwq%x1a$@4*#%!N%V>$V|%~2cvtP|Jrv07 z?1512LRj^-`GH(nG*9D6e)8}1;F?`51HMm zO>*`Xt@gplL^mEdb&pmC28z;*VGc-K3Efrq@MkgM5HdZ0n03LQI zHO;2*APIuG!Vn7bPyO+=8>g{>2ZM~%^W;701xRq;gq?-?0(qsPx+hZCSxcfmf!F}Ia}4)z=5!sMjNv&}-tTA}s5%6f=IBcG*E;H&6G zMT9>7dP>4A?kW0eddQnPR-nY>cpQ|kns=IT2YL1)O6(me{U};7ybj;eXYdOVPtU5j z#6<59R6+S0EW_@Ua2}BpZAV!)vO<}zvog(pdms3)KcdZPV;SGrT)js%(+W?$xU}TU zhx(BgJEZyH|J-iOA4?6Tv4Z9dWdpUhn>2Oa+tC@VH~gIViEh}YTbVt+88DlI((zdO zWen4@H#M9hz`<>kid1239{-Be=8WiTphC!B_h?v9hF~MV0c=gUjY^Z(n~m25RX8oR z0sx5P{^u!?OF>BU-&K+KTKO&%9k~I>|1mxMpCv~=scb0n@RJF05|WI9f)8)sqRxox z>xiD)lxzDEzb>=kB7gn*wdV8tGvdUL^CX)Xy|!-!IG~22&k8tHPr10d4vdTh_nPg$ zetxrwZ&bPuV%f{(vr4Qz>~antL}cYM&c3Q*Ye68 z-HU1`=`+3y%plps&2jVecv|VEHJA5c4Z&|Gw{okhlD~a>3cs@9icLxi)hjw?^cpCc z+|n#m*JUF1s-+5SoYh$j*z*v8+BP^j`JvUQ(X4dNsR~Fh%9D7RIGM-Vh4%v+-*lQZ z_4ngf`7AEA1L$5}Hq+M8DIT|hLtOYM$s#ZlyIUI?-niG7X*0s#q+@`M1EgAX;zdP8 z6_b!KVoUbnzAgu;q9nG>y{D^-hKDC<`v+5Qf70CRyv zY}Q9M2*0xg@=l+bjmAJMRuUYJq0v%5aOf94O4Zct+SD&QkV4m0Ds zHA$C3ln;mfLKN^h4l1?o4hY*2z2&9A^YZc{`Ki6@Apm!aUNv<+Ks#>JZOWDvxI z)6)w6{=&C{0;FT5fB*91N956wo0qpYDGA97ro`-FtLW|}shD@| z3&^E)tFFa<;o!gmRh^cO4#1!fx337qfaB&ED|}~Q%?0qbm9_QS=B8MV%A5;dZCH{V zohX#BVXN9kWfvEY%*;&a(ST*Jv9W3C>9dud_~@@^jevlmYW&Dg;*mslbZ#yk;2J3z zg=G(M48yrObPNm-IHIP^9vPzhw(BPhTjgZdQGrxI7aNwaY(|E8TvhWu{O3=W0MVBU zv<+xzEv>DY4ija9$r>H4kMqJle;yPb#aSz(SZ)6ssUIvUtdAI5VXz(ksBs& zbTb<=Mv2ltvdr6ErAB00Hzt>i+bk|F5|EL-udf$=`0yb#oEf7479-sqbl8Vmw{AUQ zWE7{1jsE<(Z>-q3-fg_JePI{#T0}$yq6~@sm6Qk`KYsi!I2iiDYV|}YSD7LP1_lQw z=bd}^#Ldm=+aoEPL2g1I`rqGsmc(KhfcUoZ+SQfQ)6;WkXz0)IaL~)l2du0>f=Gh> z5Tf+nK`-ZORrMhCZzfT5fu&9K=r(4qw*}}0&F~Nk$k0D7rtW6=av8LAfW)-%B68_W&OZ~hz1ow)%AkM zD-iWVYk*849S;vlyh_;MQj=BjtV`9$Zj*z90~W`>v^UVue7QM|q+-OJo!K9^ww|1x z8kTD-KZ%FP$W$(HteVn1J9osRtG@L0{gRVMbmz`ob$-7K6x=9uTy=UZep`yovOyE) zhtdT3s%)H^?dYYSNNT&>%h}mdv0p&k1qB5`m|mdWP|8>9Fkyq}#0v@hHKGm$1k{z* zMFgVyOgt0H(b?Hq>3ea|i6pY`01bh~hDz}9BZ1mC=3~lRO%8kVD0emVJeTxIYC_@W zVAqza`*?>ZCc4@p$QhnJ%Z77YUHQ$=&oiy_W7WZh3JZ}5=`B16Q7=bF#FrM?)+TXr zaUpSlF_t*E1}PFEpTecAr>9_T{mj2lGC@4-6v0<<&XI|dQ-_*n;#nWENE7Z#> zREtJjCl~F-j|&hYMh|1BgkIz=#8&tEGU1o26W>o1`z9Ts?YAtlN)Uza>lP-Ky^uS!Ih2yZVz>qkc1?(dCuT?dy0dL3y`5}BSHp`GmS@8v{4eCwzaht z8EfR^vZ|^?u;A$E=njh=cMiM+J3Bk4nGL@<^HBJl%!O>u)Te*`Oa;*kGB1dIva+`! zy2YVR?|LK&`JQ1EVfJ=*?vBWyz!`pe>>5Fn_4V~d$HW9>Te)Buh&nV#(7&N*8W=o) zDnb=o?S)#_pT9cNDi}sCSgR3~oxZs1Xu@k}*;W3T^%Uh?>oPjdA*N?X6lSP5(oG`x8F?Ab0mi31M> za`6cW9MsP_pityZ^$ytaKdqt&+>6~vQek@3sVM(dLAszY4uan}StL*;>TiW!Isz&`>PclE%Fjg3u;lJh-Wfox-=7<4D7&N$c@cMuOt~CyNt$7~>l)EQSo;+Ya*S`IM5f zyT1=*#|fG}lo)8>aKWgW8Ugk1nvIK{vA*2AG?3+x5QzF~q4p?h$rxH3Ote@!dF18> z1l)N4{=EZV+H;*>IOW>C;jw(0dQU>|D2=)k7+u`lXru|DjF7UMu~`14{e+3oW{8(j zdm3NC3jznt^XK6i84uhL)AD|PLJE0A$#TI^ly>J^Qu$bf|BT23-FQ!_LDgNnlP&^{rY44U3ygXj_+ z9WCPFQCaaXNbU9O-u-^zsOGty*9SpO&CREc_aDSOJo5JFs}}nZPnkO-;om zBtWx^rVU$+iz~I_7SjFn>66D^Cw={p5a2MUc1m|(a8H2VvMQ#OO z;r)t9c@-7HtCh^Qyo!oMNh;44?;pbCun_te^TZ?vUR~YYAXAGlCC2hu-8CyEh5807 zfLTigTA7cJfJkFwUCOC$^Dw&9ja%NE-+ycwYrUf$3@p#X?YRBhw&wL9;|+t$Mb+f zNA0tNS~2BD9v>eM+eGMczw^V(On`>zQcCCNwHx#R;sz|>p9kFBi3LA?uLsQhx%;l) z_QqWj5-As#G6bJ~7Xah&U$*2pX5+ZHxX2hkJM;QyS5firPYHwt85voPyDd2x84Fp& z%I0Ni;r6y&Noncs@i9Fc8)51AMRHV6k6f-o+WS_cIlxWtf`aZ46C*1hUm70pZc9ss zr}6KLjoVdpbYvA2@SwIL^Ol%+<$RAgl~%g!*RK+@UNZX~d;)6f{(Bm_BEZxEok8^i zL~LPcX?V0b{wRwfY`{V+U(Kjk6A~ZbKin34w(HhLWkp}4^yJT)3t)ta$;t6LUw!~- zmAXujmr%0hQn(^^7uxkdTG_(x06=uAN}ZoKf=ZSo;K??s=UsRlFz-}lVQ;?zrHDe% zE3T_c28odoh;|DOz|cws!vH$qWYW^ockkc-`}gmB?YS)n8M7u4y*@k)L^h}W((yacEw`1x3{(24~v0;0k)>sJ&oCPrp_0Hv$e8?X=@HL z=!-G5P%0cI_{IGE{GMx-ET-0`m%h@`=_XPXXiVjG)~s^MLCh-xXr`-=T`YB9RApOxo3CkAI9j&NZWF63d7THdd*AM%S|GJZ0TI3xzDWBac5Qp`jw@PO^X4` zPB!&r=xk$k8dpjL#Gu>OggD>|U_hXrwJ&5A72$)qstcZj%6pU5tS71QmB#BOknxfGqp2A>xz#pf0_yo6`{Gn77o=%y z23lIJpdikeO*lC>-nHTO_wm8O=0JQQDG3S8nX{3KK0cHZ*aU_r4RbC)!at&3-oFj_ zqoP~<#S0X&!lM=;T%3;y2@*S6ss6#)m@jTvou$=ij*Hd~iN)~t#(9u7C{wPLlYCtGW z*Lt5WbJw5dZ{2P>O-M|X)Y3}k7NPv5zX+W&nbkP>I0ywEAFkJvE}Xv9omlE~>I4g} zsG{2LI^ipaxRC1Rppm2 zUnX%{-08;3Pc`RFbvDd9tVuB5q zr4aT@1zz&{C-#@%Z|mO*3Lsf}lG)qID|wNI+k4GwH%91;$l3@!*kSmUhGXkJjh`l+ zgn$!yoEC3xj27kP94XHsqivzBMujEnq6PISDklICIrRnv*8SVlHSjm9} z@;?a^5qW%ccDoC16QvOoROr16WjWb#7#+7f35A9$yuz0Xb)hAcIIn;eZZy{vgbZrv$b>*j;7))NBEw5AiRCSn zmc6~bnwk7Y0|Owa(|&lwqD~Xz2NeQYpTpp#kGU%0WDSso9cI^JJ;tpU}_*d|5OBM?zX!K_YMPv~JT= zSwjQV7XGmsPj>I)?Ho`)61$PbR7*?iyMFy=$gAJKe*-8Wi2&tFc94X8wWqD#=GA3DO%ME#z$Vh5j76b+k z*z=T$FG!cJnTzEGuz5(|x(|{9px;pTu9SX?X27EVFl50o{pD+29aWlwB*YqEsjq6^ zRJ(3ANxAhAp;$UxESHq9fyz{qW|5tpoh;qC5Kg&4ECJ(BZuL=b_v7ggD^-oSYmE4lW~i9t%6m%=-EnZ^!9k zXL^uirsp0@66OtdLI~HO(I6iHPUZ}2@VmOYcK<8Df_H-6M-HHIe8QCED$y=nTv=gf zVQByrxxzDi+Q0x%6i5X`tS9_@Gsu91D1tdcC=JdhJBDx)kXlWqe!EWR+Eu$FmTQlv zv!OR*f2By>0Iq|R*7zo;p1SJgTX4#1y^mEO_5uB2$Xe-Ah0Rl8*$*ES7mmO0c3$5# zahF{z!{0G7WzMOM92`LpR|9pHzFDyCv6UutyWy2_@|TC+EGuMwToDIt7oz8|X_vO}pb_epd`Owe-M!Qup~q!A(UL2lG6r!5{0c7IPs!MA!$oxezJxvWj45bmju09oaz=`y z_~u{ozkc1}DzvtJKWmZs>Gt_+6Rl`;6O=VU(wy28zgWGO!^|7Vk3;v*Y1?;W<4(o z)fZg&Iy*WH=3Bxjc)j9&Y})~3M5?jS5$l-Ur`6Qdlz@=dcfmVf%h2fd<)Xl{ub&qdFw!T|b;T)x(3Ne?{ zMTO@!_7e|pW378G`pIVT{>3g872}qfe|3c3%38OcgUpg_p7va!R4>x& zCAY6>^uIpWzuHf~_F3O;AyVAwTOa#UTBK0Srt#cx@Yc+@QXH#v zr=zvl*x5;i{RBkQSVBJW;7lRKb>tdqXh@ox=JXeYgr=+9=!w3K>UdVzfeR*>TeyP>)Q!4)pN2uEdKcz=6PWPeH zUHqHfe@PPA@5A%UlkQ7wFvIZ1p_rH$0TI!Ht(_SQ35$Q@svrnwv7PU%95&a#etlwO zWOVcPZ7?@x9e59&Xg7fW1nhk?I03yV(ZvN;7i16Sd*h`AW%OF87kZ_0{ zCbDl4wMxMfUjX#Mz*w^dX1iPw#Otpdyj!5K>97Akc0?GTTe6`B&i}ILN5D|1?r;+;3iP8wsi<}U?EB3wxv_s^2SgK`%!>A0uk8Q*oZVJfno~kgQrpAwxvB%q^}4%^X~303I)GgIM8$4sP^WT zFe2vnb$Bpt>>W~{n~Mp6@#V`Kk&R);fW+Y}Aj^Un%3OcJ7A1H@Le6EggQ){@$x2S5 zUXuX}i+Nw_o!!ewa_&gbuQHULjFnpxD+(UoEiW&hwr(IORR55kPQBOI8LvQ>*j+0> z&qN!c+ZMngSWiyW!O7}JdzSy_v)R}FSj)R?SqCyd!nt<#IoM@sa8_)}K0D`ERE+X} zUs~(HJjVe@=evH+o6IrBs?HI3=Uwz#s^kcCaHQUG|Nb)WCs55nKNXEZdM2ROEdafP zNwb@vau(WI+u9!LH2}ASD0{@f5ccKE7gasuFCS;_u8qYIP1^%H1s9GA&|ELv^^wd&yT zaBgKqQeQvaedvAvJXPvl*vAZ&{MD^3m=K-RkLY=>rz2P=$0P~LgFlT2bYsHdj(P9>if?5oL#gEm~= z{e>X6Kpm!2NcE7x+J*U3V4g^L>wUDzn@#IjX<4p~q%XD=Q*8ig*VfmORWo})3NR!1 z+DN?k?ORPb#iQ3BB^qOHqFpDFHO${cd%HfEE_oT}v>dc{`pWCUGn&iLk*Ljutx`~G znwpw4e;S}_ymq}em@9w&Z=<1=;9}B-3zAXjkf&-*%ibOl)`+g4?YDQqgVR?rR~?aw zu0bG?<@^~XoJ#N$h-B}re^j;cKl=`GUs4hS2?vH6HaV^1-@PyiRi`i8^YrTvB_V)&@T6-b;Ck1TkMBrYSSU{WuwL3Vy9dh-#vh?(78d* zuPbPrJ)RmHlY$6{vZTf)jlEFT;V{IHu%;O2IHRdO`|{@J54- z+S;k=8O*@98$YTeO}i7)*ovniwW_YpHj<(Ju1ptFSVCYTjm0Wz_+h}R9Jn+Q1;wV| z6*N(0Wo4wj#g$Tvnpj_7&s|JSmV5Hj+QMST&E)9#SduRG&fU8$Nvy^-+>b%BYld#l zk}M~e%+{)73?7>dAU(ji$WaA(eTOS63=PS1$5&;j+3Q2y-|A)hnj8c*Bu?iLrJF|C zgKJ3~mV}_%7y=1FD#b9jHDg2^pOA20&u3Tsv;WnpDiuus>g3kcq!R0S%*8ES2KUf_=Za8e|)2B}r zNGB8v)nh?m2H_TJiut`7>~uwVCQ{PQzd5qCu^&kzB+U9hUsjb9g9{F{`D1c2Z&si< zCcVRWy}$5Yqx8@FjM^gk2n9PJYgu%y|p0>&{q_LjP#x9>AcGTnwB>FKZX*!DB!uU=4d< zW5qapt!!*eR{GLFuM0~}rGT64{a58&+X8$0a0{;wjBl7Uh9|Lqz7Z+OdNVnLDM zU9`O8QoP1hQ0%uZAWXj9J`CVbzOHujoJ5fcBr@aVh!C&em>wJy)zhPLbaZTH>yn4VBqJ#va&jKV@h7YV%H+V52uY5LH1G_-0#IxX zILPvgiiEeOwqaHwf$6oEa_Z`b4ua>1=fPM4kj$0)F z*xd5+cuz9$>Y|7`=86}jeu86f1mC|EHWq02;1Lvtgru>lxz zXJ6k{51G^(&;8|yv5AVznXh_9|0O*sdz-g2Af5ZqHD3VY2bZg9W+pv690$aGm@xoQ z0$s8l$Se3J8DQFjTTLgI^g>4FeZ|_+AH=m$rQ0oi`-q4L7Z(?gg>`2=G!_%YbS)61 z**Js0>^ue2bIl=0Z3EaNXg_a8Mn+V>{RM~u`qSd_vR67$A7jC=43uy9XUv8RoOl@0 zFm4RM$ScIIR0;l&6TtIbSZ8ocsSY(2^Z{tL3^!0F8gw}=X-fAhU1-uEa)AhB0wVjgq4ts!Z*g(4uJ7S6SaV?$6WS#u zCCCJavpiyE26dzt6lKjyhlg~roz=Zi15}{k03b6fJq?J+b)tiEgOtYlh+ql5cG2J3(h{CzJPLDU2?=d~YVOhZQwXUoM90Oo4CSk80TBaa1II7M`Sx^lkg$fW zn_~|>>A?A$71u4r`YmjzK!N`8qOo{G18qzUi_5RnyM+;pqv-Z|b11!-4u^L1bma_|OV9_TDE%K=W~ zlc!Hgw=T!5x?rK#D=HUWxnq)>gbe zm9k*(mF|=SGYqL200*g<@k;^r58WNAVbxyOv#PCMlSy#HfFSbO(_~JI5}8|_yK-}87ZLqXJChJwGR#s z!f2Dt*w43MZ2~#~CGek9H{&#a)T1e&QDSaxN4(W6ol8zgk@Y`^WVHr4P>xi~K_4x* z9)-Jp35^+S2X;u3^K%jR_oCY81#t8=L14guo$?W^Xv+td0|E3;^OwXYI40D?k}*9 z)A!H*V-Y=XnN|8)x1>;^2#sF<8*{tE0V+vWLi+0MjNPhp;n`@9g50QiJ$^L1wb-x* zlRsMre>i68dcRx^d701q9H1KPOi;n>4oq2;l^r-wUOV48KplfN2e1exBtb9i=;+AE z%zO*a4}O6p)J}*f08DVl%K2(0W@aj2G)~zaAE6>WCLsA1|M|Tz-vPJ+B|>69pYDBt z!$TOO`U|3G?MOFL;|goM{io_X>dA8$8mT$ot_FG01FZ+%5&3-8b5q^y}49gO0-Zj2~vX@%)BnFA#O`4$vGOPH!) zVIctH0frr*?tx<#BpQN;oXP7nF#^^Gm^ly}6^I4sEAxrBG9&_!5-t*2Uq?npF8A>x zYQFjvnQvrA2^k?9biL@ymnXwTey+-h{a?0|;BJ&2+ovhCr(a*J7*6HQ!7>QARfvfs zMo<>2KRti#K^sOZ%-Nld6Mp-T&)V#z?l20BBf!hu2wyYYhH-G>FLtB+DF!%E3e*c< z<_)r14Lt$r#KOkr3j`Y|EBe=G8o;nUu1;4VcH!j*Q0)}~5`*&!IlEh$ei{DnpRUlw zjwoa}iJ(`RJ6;q_hk%KR)HIn^apgq}cE*?(84u|eS1yT3DJXhC1Wf|}+WlodAcGmB zCYHZe<;VfJ|K?3N0OvfSqr3d+5W8bLX2%KD;7_JiX;0T_ly@dx+x^7=Cg>_>hf{k0S{Yj4lfV z5Ei7YwgcddlVvW~vv|UfP0;QA6n$ z(v}z%6;*G+q=bb}brAW6;|rvAoZ}ogdytkqk5^ezdgVR~oMv4J5(BT%*Z1#o1{Mz~ z>UBM`aR@p6xuhSe9Q+U&x_j*lpMh%REJL04=@S`nni~IS@iGXp7*VkE;e_zIt5^E@ zQzkXs27(lw`M@)wgIl~GnsHa-^%<3fG&oU!iy?7tRu&DQ55zn>6qTL*edDu(HJAjj zZ^5Ghd!iwP+HcjiLKtS)k#^{hs%0_|XHQNRqQDj4F?F~JwlmVEg@yzi5!vg(f3Pns zm7{C6;VOmEI>Z+@C^M%cDDaxZb0Cic!^2DG2gGb7I53-@##WZ(;0OI100Y?OP*ykH z_~HF{Z#Ipm@t`zw*B~&Y1bMuFPT92^ z6@&N;SqLs9q+OrZ1J^pJHNfT<;Bvo{qG}m=i>jFgaQ#+RIsm*-dmaVqy4eNzBVPe}{QvXqmj7ORnIp`qoPYo9s%ds706B6G?@}e4 z+QfYLmDMXyw=O+BQx+zl(zWwW><*Ekkq6el0<-;PyO@|8KEyr@l;YJ|td|v$MwX+@M;ivVC(PD$;ZKux^C|)1iHS_Yaq)-msgxvE1ePF zl)}kQB|p#3nGi{ON9b6=)q>AXy}8F)+VS{LWBk@{=qf|CLn8+UA4m7w&WsjC8sDAd z_uCv0THg-J2^!)-3;S)*KEhHmRAOn2%@iyARsuJ&PUfiooX<8>HS{3XFn_xB_g|`j z-bNAyA?opo4nb|{C{anN2GR>9rnqfmf#c)rowN3h4u8y9_99Kc%TtqYl+sZ7#6K*T85fPKrt{dmv+AL?6U7{e`e7=>Ml{W3xjMTlj+)D%P%P z0{81pRy_Z zzGH~U{PipDeI)xS2h&R{a@>?X-s!Qx+p9%A^QSAq2KKJ_gn#sYr+iEwqg9XY^$qUy>)Icrde!L<5g>}%(=sA)kqY;Hf6p@hi)y`@FA0%EJCT`^alU}ut9pvp26v^2 z2zNBJzVc~{8y8^o@A#?(IJ_@XLi^K{i}m@@PIdh<`F?wJLMpu1c^4ANDZ_JvTGMSK z{lr0%36-emL6-AvoueNsRan>U!c=}qHiOTZsENXBYu{B|JJY-W+qaLzdB?_Qd-urK ze<=t}zQzR+7)KiL#BalH`=Z(3BeSD-u{irCcX_FMQ472~ccv$-f4tkw(Rm{@f<0zG zk-Nk4idy(;*Ld?;No?wqh2A{srE&8alPSY{rNj|$o48MRafRp7C!^*fDI{}?-?s~Q z<;+)ApY}>l9eh83rf9<_g_ZGDxFy#A6u02B$J>OYr5+iM`OW<0=63%keE)rBu8~S< zY4V7@o%)luE&tgi_tEVB3(RbIv2#t&$Y z{mz-FeC9B^hS%hzA~Jm^rv%bo^wMN%KFp&M<&sIrfZE9Gbi4k zr_`FrnTx~|*n);KnB6CPr?sUh!OAENSR?JEjZkRQJG)g-t(yF&G^~E+kmzb}^)|(5 zl(C8oe!rd{mg35G?$0iH6EWc;;R9zs?-}D7rLF!hhR%-PAI9P)U+z!vpN#ubt4i`% zW-kQw~l=?R64tQgYC`e^dHbLXq`gAJ4NHga;UaSQ1#r%-V@z=q~)G+%~wTnUJ%XPc_SHuM#W9Bl-kli!SB0(|Z9uGeJ#pugM ztIuA$sN4F7UyixG?6ya=o{azetS$b$`-e_vS-3JSJskmM#+SVEpgtQcKq=R=cEFY!#({deApBJMP2t$YX~-#G9R-qo!yPBzqa50eQoNt#AU1? zL(e&J9h-tTa^J1ijhcJrl$cA6Us{G-^b2E%w_Qz|aQy+^>4cp6|Hau`g~idm+rA_u zxCM6z!QCZTkl-5J-Q8V+JHg$82Mg{HJOp>Aao5JJ`&7Q~zt-B%KKtVAbHN4BT~E(h zv#Z{><`}<0xwx3!7#%wyG>&zC_I@7}dT+p=OB)-V`CYe;+XM3*sBh(NZDcLL`&((| z_ZBnjH?i>gJ71eUE~hw-58?<$7Nxpf@Hlhij6wz%co`LqY<1s^gSk5P2^F>Dh?tqeY8#fMAxW%Q2GBq)RkU9c_fXXuDD8$;N>pFdq= z<F&{>Q>@!i`UMc7W2Rd#~!RW+ESKzJf@tnfY{UoXX;t4;0p^B}i#;Ns! zh(0@6d-rbLR{DdqPmBhnA&e;tGB$6`h1MB&@zpsOawYs=*cX1Xx*R+6Gp`W#&@|-m zfDcRYB6Rxn6hR%+B|1Q+A; z(Bt7h)b0~KNh$w+ZBh=h(K@b{BIYv7Ns(Rk*EZPcfjR-%mtJ4}7C)#o;Mb~cpN{{v zqd5${+2MT+|2L-5&}%u;kLyS`&YyOi0gf7)>u53^@~t!pB4n^4@0k#a3)+ zL6n+9n%Dh<;qALK&pgy!eDlMZ+E?&zazIz}kKvL2J0H+cU6ou7u^O??c2Ar0%&Y=9 zsCIF#Z@Dj~B?!9xcdgDeKPC|cKq$|_pApX)`qHX-sc+*_&<^Oi1>zdxYqC;i^}#nXTkX45BQU z5T557Is|<*sbuMrdeHJGDLvY`7n$^AmzL(d7)H5b)<$Zs^V?^u_VgA!HVA-O8){!t znG;p?At56{+Uw$hNM)KK*N~v>mjYkCO1;m-R>uQ&4h4?K3=ML=fj17&w96Y*(^I-4 zhx}mf?z`zHqZq?8 zvuMPlq=;N!k~@JHW{2+1sEg-qRS)rt(}lDB6l?e_=VtC>45oN^7YYf{v*$u1LpIPM z`6SWW9f3bY{vMaND=e3NwNtYerv;}Beh#HaKNxmd7R*`Qd;A)73NzTK@wKJ_{rVZz zy64%uE&}i?9oZ*Z?JIV8LAKSGNALNX?yL-Rl0?%&h!XC@TZQW92NF4Cw<)vQZE)bu zH-8K=I7*`JbQliC19B+VcszF=ZUlT~Urn6hle-*x+|Q5&46;D4 zk*h~yw)&F+$8jb-nv^Xmc2tUSX#Sujjzn@j7jpsNR|dqcJAXLlK-U<0d57BVgS*u5kx#j z_5dJmt^K6eQiVFZ=kNhC553GfH~oHAZ@6G_an=12K>&IrV(ESqD-n+y=xh#QR;2l? zWj`n$Vs!l!#kE7qlY_%|k|CI7^*&5Rn@sA4?5e`&B)k)DQJqr9b6Snf-V@pJ6P%k9fQ`<+Mz4@>WW;1I9xmh zboH$`2>0}!Fe2e7S3aK#Ka8PzT(m zYabpF{n{jK)0g2TfxW)7#J?NMYPoE`yV&SH+b7~#{e=qO)Iu62i%6>S!G| z2L5iRH_wk#X-itu@g|xRMGF_f6_T4|IP%Mjh;rcHlU7`o*KjfZguE@W0q6b^WO@OD z%`eaI)X(jVewl}cYSbHl5fG7JBJ6yXGZ-jRYP#Wx8vuRD(e-!{>}X^Px7HE9N#WOY zzcJo=eqlRmBo^*S=$lv{^XR&fw|~0ytF${UI%jAqP8j|a=4!20KO$ix#xl0&!0u8B zl(tu`5NC#_R}4tSiO1c3ZzBr|#K$#%_qNs(V6i1=$;Mj7U?xt-9}sw4u7x7rOO__` z!6o0K+1@5Kp=&Px0Is&Q0Z)DCf7K}u+fNU(&9e9Kk1o5Y(UF%kh3eTO92p@)R+0rU zHf!&5^=^o&J0WQTPwVb+E4r3)a1GXiaKVIkpSap{Jp-Zbx8DADTar8KA3u>vUGqSG z^9(+0=W%CdxZ^CxDYPxSc;4>mv_3ouZ)L2RangRz*t05dJ(h4DAv~;aA6~i;ZmMhx zKCbCbF%Z6`=NrQ%-v42iE#@u83xK0)jASgrN%4N6RTAC~FzN?sySuW=0tTUVRR?&PZ(I$iI<7;SgIU|{h zj9#Zh0gE)V*dAPlr08Qz8nj=zsnan+(%)Hd0rdQV)Zd_wfimO+cxhJtMq5|h!H z?U{yBtR3BxFIKZqsN8x`UG=@PC>~(kH@(lLjxf%oR zZrwum1?@G+g9_&0RjZ;f{Pf$ZcB{n%Ngo3iCbgGQq`Cy33slH`bDs0n&BE0T4U(0u zjR+Y*f3gl9$MQs=#KW#)j)myE+!+6JLdS(WRaZ+{=z`UJXtOYS)oLd8vHy*HUVH`;D5WD@+EjUd)iEzgO( z0u~|XSqwLZqhO(2!Pml>$~zb>Wj=7qlA4}2Xfn`OCR+A4G6EF^EpZ=TYcZ4Lo=Z8b z<)}gQ_IO1G0bu#lhI7GUM|3#r>1C{Lw?$HZClWJ^KNLljn(!^TzrRTJ3;YTwrtJmV z;x0=0e)C<7baqI98kW49q}K}sba_g2wvor*tfWj+F#k}naKwi1n!UVrU`+}+lpEc% zOq`}bP^kW1Xs~tN+JaIn5iC(Uv|;h7LfUX|*X`uDeQ|kVioy^lrlcxU?uFas?nISQ zxm+_&qS|Z}qpyJQ{qabL@12!AGf8*urKJ_m%{*b#Q7dn&KReE%5@Q?V zl04s1a^&4_t^NHUEQMO>3`;jRUd8bYU6zt)Rr+s8eCZ7*jTpK)$B#-=!S%kj;qhrU*JBBmouwjSucSOQoQd*otBzE~C+%`ac%x~*x}2JR45_+x`ISqV%*PX{z>&Gnc6K!m(w}0d z1Y(8#TY^tcZ0mRghSoGnw}E*KmXI6_Zq>+j#LE!_}QM{(Vqgf~U9V z+r-Gk1Jl1vPC)7MPqWJ6hcB13*C!x7=@`1i1IK`83cOnDn_H~Bg>V*d_`v0F?@CQ3 zSl(AUHYBm{%;olPV)F=Ezl_y^I>w-SGZV*8@c2|7Gx}Nz^}GFAQ>O>{6#KNWGcylS zRqrP_5G6HWi**c)&Zl@h&$^zLbhRY>=h>DY;e>FC^ev?|g!+#HiorD=abE*C>+SUh z9`&ApWoLdv=3r(m!&nuYqp29BOM**;8;#mLt7zlK!@N(!^($`(+gJi?XQIpPi51?8 zEgau3I$JP<*hG_X*sYb=vMKxCmt<|W`Ice^{ym990iNSZr7M~%N4~lOV+qj#1P{^KwtAK_}W-O~ePPTI;%dP<{qTskEs8UKb9{$-83vI)kOaEX9t6EVk; zFNdf}X~vg$Y3I%Jxa(&TUSxv;^iLQCY{eZ9<3iSi^mIbL5nFJ`1y)$YQfO2*W0I;( z&0n-Vv)$t}3_p{ktRYc+pFx-sds*+K-5ZqveVMo=(VFF&{i3-PZy?1AZi^-6Vzf|* ziGl2SBRR(@&(BG@>En_V)Tav}q3xkak_BQM&65tg&e?w7RnXSSIy_`c$UNA(s1_r3 zP)_2c#vE#!v$a1cDkutZ&&nj=k2K~*-~H6kyHs|ZiK;$_aE3AGYKg&oH^9RDAB^j~Em0GI0~5_pek+fsHw12gv&$)(o^C zS7j&5Sm9)Nrik6&Vu|^Ij+bhiaqAeK$OnquRIy3S@8V8pf2f1kY_<+6={6jl2&!)8 zcFxYo?FUpbQSIaGAn6i~?;6)6ya2n^n49YENfG}8Vac(KX8j|rf)38p-M$Jgao?&I zU5j%xpRHZ~t<-z2xyJMvi_Nmd;kd#aOIOTSCgyBH;yq#L3saNp;!aw~%z7B_&DRL@ z47(zB+?8^k(2mh=X8e6w-hTG}!od;wv+0}4lDNyjJNh3oj?^`#R+_MH`JVW6zerjs zv+Q9D+O_*+T#X!0?f8yD)VW@nQ^D7{tElLUI%%N}yp^Y9(TQl=A`ibM`(9EJR;UB! z#c&}2=_f}(vUMF@--IpE(k@DlPko_}j(6J86eJ<#Nbp{X6oQ#jT8D8`o=SIH@p^i( z{+K08XLTS>av-@}KtfcYfS5J_T=y#P2_gx&_r&tHaxopj% zIOjT{MUi40?5~J1BuS#Gn`lCeR{1xcY$-Re>3t}(vrXT*B@zhj-dy9G>UbS=@+Y2GGR^2>fST75tQZMtmdLjc3wbIJ6Z^7`~7ngCb?C+PD`gs`^({je9 zw&3Wa(N#(jXt=H`0^s|m;XgUgsAP>Km=vr&PnxVgSLtZ_uQ_uPfeM6-kZNyz!P$6i z=)Yj(CDDJHY`fo*35{;T%1fD)IDhU)4Pzo&(gBIeEAzb|1tel^FFtJgB=hhnxpm-{ z(ji&L*ExVlWh#j1MwUMtJgSXGob3Ge=P_ZC?Ik}htZc~2&&Lpb4gY(kC78J)e^FF=nUBC#BbX&mu~zvifg)K zb%Ri#q&g#2M3?=rEppsv8;!1^)B`DMt-JrB67HRIx3=>a4}F;GxRgh0v7II6{k_?z zcd(7eVG@%Ch9huNE|B7C<&>2F@MlfIratNSwbWyjGq0+4G&Of*#HWBZ?(PAhZt?0I zj+9Ta4yYOA*_}yGFuzUfY7$`r>AVFF{oRNe>;|me3<(8u_-2N%h=k*$zq%3Ao%U{h zV|_#OjhHBKoh5lPpB&`}mIo9T^NUnW%z$l8{*S4s6d24zV+6LtN%&Gsn=geNN1uRg z@!06Hn8>2|JaOZ1uNtTG($ifW;a`1Xmc+vsiCBt}D5s)i!cCG3lPl@BL?LITe$(BA zdsGQG4R~Fb@tLTo<}|CAQACvc2SQCIpOP@FBr4R&#l8+=NbQv28}D#?XC7H8Q?Uo! z(ta5##UQ{|h^WZ^_= zcvx<%dIwF3FNPS@NxAbs=s)I|o3H@4ML zEape;3Ho<*QPh#FktSHNM^Mz8Sq=>`Zm!hZb zlWP<^;S&Wu&xg0grJ;{-Qkg=r%7@$1C{yI;uia+P|C%#2a$0w6_jS8;Yg3Au! z@SkE#6ooykVks$Vd+TvPtUj*rp4*8+I?7nahEa2kP_%G60*x&@=?#o&%Za--p?0n2 znz(${_^1_@wET5xTV1AqR(M0k!Z$*)q4XWz+3{BZL+P+KT`D6{JYqa=kuFIZ1vS6E z5ZPo)yyURG+}g6wI(J-c#26tyc5r%D#^MRalF8L;@M4W@oJQd;#owz`>0yYKTS8ja zj>ImfQ>v)`B&-(S45`7NdQ^m3)%t_c*8)npjF7eq+BsZgg%q-cOKI`+m=JOJZHHNM zvA8c}qOKu`u`|*J6*$m)&EB!Lo*#1Px9f0Gb@5Y%3+(38rqpu3$z4QQ8;2MUk7~(P zG9ncf`zsf)2r=cp9g3sBt_q;Ex51y;moQNxj8H)6 zL2+Rrtj_G0vo>?$#|dkQo5;0FmdYn-9e6)(gxI_>uC!td>_oXtt?%Vsx%14(>RE(o zT{-Jb%sT~i>4LZ)m)ils0__LMq<6c}6xahJX_#-0D|RhG>{9Y*JL1so^pke z2%Pz75g)jfT*hJBI22*BUDY*|zUY2#9|-!)mrJ%TkaIAJZ%jc&AHQHy>xmE%MZ;|- zkQ7WrOMhqp=uv5VI+!BIGg9}!0qYM_X?8;i^M!*g%^4>>)1?rgt) zRCH!7T~Iow2_iB_uhPien|=vHZcF9gyZ52R?>1?~s8z5qHsZTGV>;CZ6Z}YA3*TF< zSLw1bhZ!a%t;cz1uJmR6G{!D39K{w^|mc%==>1ovmBqloH{Ugo~ zAC53^nYFtR15Yw6auWc^(5BC#r5yUG!THT_L!&=RG zgAh&J01gw)eFs1evFXHLHtv_#Cs+_Oo-M8YyOs18ekNQp_8mb4Nf&O^e##6is-QjY z=j*(rUyr)Z=&p&)5H|fK3yZ<&tQKpCrkugUEtHkcKc_ve=whFN=3Utn_~ybu`v%xf z0l6)HpSj=l2oQJ9_wDz~>m8s2d?kP)NtJ$1qvjO`GYL|$aBbmt1hnbALjKj>(9(Wv zY*AHR1nS^N23G{k5Eof$4Z}DBS#RgpJz<-Oy5F-{;t$XgT3GAW&#ImfZvWuf0u6Tepqk*fgM#j}r@8ci3< zk!IWP%8MY+mZOCE3t9ckSw;Mp8~gV+T~YDZ|NfO6Aq^t|=ARb;%vCD!e_q~8bzCHE z&tjbza==NC&`W^z4{+9TSb2mhnH~K_p=HqpU=QYSBPg}|;Q^@=*{SIWa)1b>Wv7Lb z0974l=!r{n4ezd#l>p$hBtR?tcYXW=c73x+p$4eERa9mUu>gT4HlR{H zYX@>L{v9G-`ReMbiZu-LSy=pk22Gxg^Zy#%|K()-|9W|XY-0bU*gv|QzqH-bf^>s_ z*}=fk{%e;1PY1qu3w$rOFM(_jz$LtO$p<(Jm>v`V9bb$i#jE?*fEXLdhybXgfWUHS zUjPOGO`S^uc^iKxA%?sT@F{C2{^juk5Fh%PQpG!_t6~7N3Mys(2)q-pYATdo=~3PT zpfbQn#z`3aH^<}e+-|=9t1512zy`P*TP00^>_WO+RsTA^fPdwmL;vN(vsO-3$rQI8 zkRgTkdNlvn8Trmt`OotB=PZ1PmV)V`9JVVhtqPr2U?_F;9@$aZ~GskUS zZ=Bd|92C5mnwcduTCh-^x`QYzhUEivJ~ZyeYU&Beo^*1ik(KU`7GBgF+c53Tb+3;* zK-xo>leV0Pm*mH>?!cV})g_NRI6@lyE6{tLb%vu$y^Xn!hvwA>qtNpi7+!ke4Rjtz z40OlcE6--!Cv;)mFEUY~Z0#03cTvyn&&PkKp||+3gBqrjiVQqi2;CXp*Wa7d$lD6l z0F^u^rQgUpPO7Q&*1inc==v`z1eVlspLmZ2rG#fF*Eq zFPt$4AtXz_e!}HL{%B0iVme@l9MOSM=nD7w``LL(ZP}#Gj8fVSW|hj`yEQgV^Zdxp z^X}emjVj~0A8IGnSJ|HH%QEYG3tElVI2G#W1+^Y!ggu`%>_{DIvcf|)n%g(>)d1x>-=YPB`nRPMq6rtAQ+

    @H;c4r#k@FL5uZ!jUi}j}e(1C0gMF@EW0YEjzNv~msyYY{^WU{2A@C5I*{Vj3 zPR_`ceA}h49Ob;&{rDO31X2^|t_l&7#PcD2;__H?!}D0Xb5JLo^JTP^o-oWb~&1hH+WcD22A$E<$w~i z3m##yu#XA@3r^J5tc1F~D9hMJZ0dP{k=n*(a)>{a(-ty6K_6TXC_xi zVkFOGXk$DyC}6!>I|`U4n90-z$kg#R2@fcJM#4{i%(44BqcF9*8{NnnPt}cRu~Q*c zof8Q$QHg9zVreZ&iCNyCr)GBzxZA8I4)|)83lG zdE>F!eX#Njjw8DWK2GCc7>|&lp3-QIPc!gJ)mW%B8XLT+^m5^N+jyGY_2hv3U_(MF z8CJ+c8g!J}n$*NsGK@nIRu z;#ihqXHV97jnP=9UZvI@?pt|g?`7?>(<#;`q6Jol4?)PvhyS?%0iBr1%hmduvd1;G z)t{!^_4@(gU(caA449mOUmJGh)EV{u+jqC?MTVW5jYoj+7zT4EC;& zIv}uvcnsSfWvk65Q3>6yWt(@moa15eMx)O75HpoIbEuLvza~^ntL7>`01_&^?!$5? zbc5MSMppQiH5_n$4D61Q21$>)QPqhuuh?{ zG^wrv0=o$sS78F|8;so7u}mbcn%bAqalaH1@82fj=S$GR$4g3IB$8b%s8wj*{Ko3I zIWu?|Y*?J3p+x;`OTRK`aP|yW&q2d}zU;H)^(`Tp?wfJ^3AEb<5H988#2 z(a#|w;7=LeUTB+_!P)GeOF1@`@&-HnSe4nAp3rh)w`yW@;bD}i zT2otw7avnZG?~E50e*gu`BT`SaLj$A#>LQ+J;l-52Ukfg%apX4Z4};1QsY8aYi!Hs zUVM&oBHz0>>GV}EPShKh|5O#sgn4lc;TgJB0~;3o0BKR^l(Ky@CfYwuP0^wF=g)61 zJ{~H|IwH>@nlVpG>*;G+|tmHE#TAfY));LT-nnFb4FAJ|V82Vx^lFdwwVRCTdydxAm4&Ot z3EZtx_3zV!h>;wH+{MnviZwxCyjG_HQC#L{s)7mOAsp!fIeoThTK%oPP-LxpV?m8E zsrU0m6s+capjM0b=b)}{e;wTy8j6W}Gtqyrd6+v=hMJnT(=wy<)y8y$TQbbjsy6n~ z{lt&_giR0YvRXfCjg5fXxB7kVFKtxs+%7IbxXw#kX1>rW_2(h|k@S3^|M|C)bX5K( zcr&Yl83;IZXUmiUu-IDjXj+LjT-bQ)+ zm1SM;PM%aM{>~|u5`*++xa82C*lC8kbC?5!*)kr4@&Y#!FLV*mT|2w;3ytKNy+DINoJcRk*`se@Dp!^-3BVq!_ zqLa#h*Vr}xTaA4?tD-2KNV)0A%lxPu2;hBz-o8r_`9Blm^%pA<9}oS~H;leO`-wgU zDMRk|Mg|4|000S3p8-f3GiJ!U;Y~-w`XzwE&=vhg1RoB7zut@<{ zEx@r&g&DZ14tUm0O^ZDCI7RRe0m}nmO$I>I_sp1YjPL<-;$Qp?BI2bUCGg3|0q4QY z?5sFoRf~{=8F%>aq4vK0zm)v{f6KpMW>c`CDQ-R1Y-UOW@AXpVDRm*mE&@@w%$_D6(`mDFsu;|V`{@=aYV8(HhU)x+6Z#0)_mUDE6O z+Nq=2Y)|qQRh<$>Ky#&H7*reQc6_U{zUmXU{{~UVfdszE)TyNoYbY}I!EtIubr53L zn#`S>PAGc-bm07BN*H!Y{CAwd!aoCJvPzNO2pGzG`tdV&s`lu6 zy){Qb_X9KJ!T-Hqsos#xZY~d?Rf3M%Xw9KyH^q==8;G%Wm%VCHb;GOMEWR72w;$MS zm&53)ZYYS+d2k{1-+J%w-e$sEa}G4gJUtM9%$Xul8<6Z7iNJwSQa2pob@HLKy7>K{9hWqa?Ri^ItFQ-dh8gBAb*$xjV1IAQV z-A0)HT5N%z!V|kgll(h!MaTyH^Zi--!|p~M096hFY;Z|B_MIttf|>GoFoM|r&jQ_K z+Ry<0T3!WCPGBAPo%Vm+=q*<*NcO1RCKKL!0=1`sAh(jM(0lD46-b_Y1wL@`Uv=(> z`9JeMW-i`>*PgF?N|y|5LUSqfTkbS`&s&L!1yQkq7He$lwJZ}6Bki0_x_QJi9D^haHk2MhTNfiK?7by*sX>V(E8>I1lLI`CJpf z5JqJE40KrY=Wk|_FXFwkBGpz28PgugO%tLxk07hB$q1`pi-$L0p){YDDWT`NT*m6Q zF!2&L)6w5Qhpt2#4>sxwPxa-}oNpa=B)ujVY5B%@bKZ)yQRzPwUY(i~ePCVOy~s z&u1g9EiVT(<3=|_M10e$(gW2Vo}0B*zlRw2<|{ZZuNf5HAauG_`W(K`oj5bUb>m@O z_YZ+WKuJ3{>h*WU%}Y5mV~Y;DBiWbA2fmk`3usXG7=8MScVLja@Sr@Q z{DIPq-l27u#{?E9b@k4?&0YaLpzeeoTiwoM*PG7;c$sB|k94_lq{ZKqIyt6vC2|Qk zLXkP&j&1Fok9~i+q4C@(7j%t4`Gj8p+(62w->^RYSxK*U*n=!YBNA~fB8XPMr&W@k zYf5{VJJ0=IRuU8ImEtLYX?gv|OwR1K;Zi&t{}3hCc>bDzF^`A9!vW_s_7wYMW%Ox9 zcq0J)IXh3VBX=;d(3ZaP($7t#h1GRauH%+8*Yi}b$?uu6yWNVu;3E}#a{6=47P!LV z+YU%pAHv-`Bxg39xI6lC*4$EEklxXG`X(lCEaay;VMWyNQdc^v^` zj)a_tHum#KTJ8N2Q7fNHFv@`yoyGb5!V+YCV~vM=g9%+od(LPFqYU z!Qm_kbCK&gn!b>0%*HN5i}#c$u7StfwBeoK2m7A4?ziXbe^#K6g2IoG7u!RdVn9C0 zMDYqkf;It0w^wya_P)<=0i$d4{n=RkYfO@Xn2#OR@r6TAwu zSjiWEaG^52(jQY=wIi$mSxo!p=nVqU##B7IV@E+SjLoj#bc@31Qkr-Tf|8anyIjf)bEIp z7I{>}grU@BMz@y^lcOfmz3cxHzteMiYjHLfVA0ouMEKF?@N8|oYM2lR&O>U%P2v53 z-0PKZ-otbD$$G7aU*|X?y*8Q62xE~@)o~h+Q$uB{f)8>lk^d-uC~sM4g7h;xiy1qC(UrrlM$%w@!UznWeK?K}$nwkR zChv+2-O2ILVf(tpRHhVhinOm50nz&7w^IQB>U$#ZeBusD1R`o4KF66ul0!L3M@#@z zhiNw$mrT6a>6E7g0~23_>IYVH1lXA0Q)Vn%m;X*Teg^o&MzS;Kx60EV9C zi=h~K>z&xS*|J$>Gq`M}r50QO3_yyPu8r9Fyl+r*E5fmH@u&{2KT;>573J`A4PxAAsth5v! zh-;IfqMsCwUa=~!C`4BILtGN4*k6QXx|)m;=P^vcVK1bi&mYU0l=DFn?aL%H+ehBa z5IW=*Yh&_LE_Dj?F$?v~gtKuWRpo6hJ|@({iVSZZ+N)H(iH`EaB5^*t@s&QviESLW zWZgy7uy~mwQsNsH0AnYpAF{dYemkvwPVPOgTM~=-d0TJmdqoqP$E+MKvpmfwl3!)Y zwZHjg7duU8mQrBlI$n%O+XP-^$VIE~4;DLZ32%DackMw}+Rra&f82cC2CZGM^V5Ag zP&<5GfG_?T`}zld=3?h!b(FD4kB!)8ksxEqpKo!B#13*W$iIHWz?}A}^Q-S1J&%V8 z!|&Lbd%|)Sn%Mp@k-kPt8-!C5oupv)!`DqGl0!aQ{K7;BQzdwoNi!C_F9w(0kXK! zZ zF)=hZ2SjT!m;4hw4OG^mI{#CUT8jNwn?a6X_fH7hKc#vB>i=v*G`t79)ZjjH=(7P; z@jpFCFDTmeR+4$*<;nN8qy5+a>Ps|eq!atG$^U&+En+GAza4oKngGz*03ZIYF)#)S z0Eq$kpV@ZRFhaVMySt%ek8d}ifA;};pUfP4|#R!!hvKpO)DjHN~cIo%M|v$HcM zyqBu~$&g$ApKTFQqW^VNx`XaAwl%dX=*rum)`^ocJ5tA^hy5l(M zDR4&Qn9l`KIQwDLxE|d)mUJHArtdj2W{2jVq6g zY&C4%`T52F+M-LRJ`2c^0H<&V^-&;R2m}PZSh<=J6z!{T;$ej4l`?F6GSK)_{^I6I z6}GihS$%sg(WTp(0=z{*o%RyJN-{m(rk*fORu+zEZz_$ z9TV=X31P_#i;f21j3NQOZM3XPg%e`cSjyOU-m%AB2F=cWY`2dj0J{-LJXI#dHYJlX z(Qz^vQPbA&NTynGv1;ID*0rxRUCG>Ke6|;s>AZP1&T5Jgv%v+=J&GkCGiz>dQPM;u z*=V(tem9fG8jb^xzVg>}i;@+v-b7OK^CUR;bxHqGzi;a`Pbj3-9*UXLYBmQ=jO%!5 z*KEB|x!qBlarItNPBE`PjTYl{3mkEwAb3j zakF|lb8nZD+38U;ao2{in^sNAQoVYNMpFrOMe)@@j}w z12+e5AHmH`rdkpNX|n@5Tsy?Pzs6&bM$;OCQnx|X8zGMrDI?97e;$3a@laXm7azyD z>2vTH9P~~TaBN2^2A98&V87Ws-=tTBK}j|@O-kDy|LsGzv$Ry7A?U;1tcx{nCY-hA z7*unIGr6d3gFB0Ox2i`>r(&1}b5bU2qpZ4!aJ0El*F^p-v}+^;xkGG|^G-~g$gNjY zAX3~p>@?j|Gq&Hwe(sy4!p4+`Dx4A1F^ep)_t=S0yA&MT#e<(u@H|g$dw6GQh8OEEKEySW=09%&U08zFV1$CC*t zvM7RN*Wm+0Gn_qxGE3_?0v?i>(sWl#?h=u(i#O|10GvyT5K4X(FkV>e%)-*$9rRqI zzZK`CSXX!!)CqHma`xR=PoGb{{S7r&sf_dDIj(GF<)&}d>TVJ~A4OzQtp~^PRiWjp zN$2Y;tyMwp$b>>tGs)8$ohre)prt$NznHEU1Cn0T_Ut{47UL8$Q#V_7jSxI^R&EVJe)A{c_AlN;yEA8; zl&$LE*KU<3n<9 z3UJ|4QdPaqS~&PIXAQvInY&Gxbq55SLE_V>JT79Hul~tV8L}}sY_EqSr&j>=|UXgNnEhobrIXQXy zuU{pR+0>nhXq!f3f3j5S_Q%RsS?MEn&N2rxdrLlbU0!?Z=XeoGOV4Qe7onB*i9W1P zWN;h50YYj7Zr9PV%aTtFShLV?&&|$aR=l1|XLPUG*(!LSUx+2*@I}5%3ws`~1aqb% zKbZev@YT7(QB=t6Da}B-rUE3d^Ca>MhZVvqrOn1)NcNMSBv>ivBH{O$%=+TVer{yF zF!~(6vVU5jx6V#W6F}$%g;Gib%tPRM&VsMXijM-IH{ha+AKd)RT7O`{xD*l=R;5nf zzN?D6w*gOl%d^{&k(bt!?iwl(W;bwc-$D#P8zx3Ym zFd7BPs+GzE)4n|^or-^$U5D+6(5kYG+{zM9*G`^B@(e63CzRWdHD$+P z{Y7R553HR_G_&V7TE}u;xS2-w%96J>^Sbi2gg|Q$4g)T$D`?-A)=Cf=r5)( zDCGRDtRAAGrDUyk_&^DT%>+DSxs>rkROl*}?Uv@U0)1@h!}C0s__*G$C>A_6w{#*K zbyKB^YQx=QqN(`IKS4MX-+(o1Tb}w$Reo>yBli5b>jBp{2s;C%eXvqRv&FkQnJAzK$Y)-a=1jN-}ih`_XQIcw&j{%J{phy zVDB=}lPWErxah4~b9!*|RI`Nj_4NfXDutDmC(j5u5`}-$#{ddWZr;APG&bNeDpzxD z-{?DRpJ~^cehSI~ydu4f?Uu|{X5NPI9i{CuKJFpmxM^U*%@Eq|bR1`jSDssGJ z`j7fGzc)RpY3y{SC9CLT#;*>BA7;4nUMHIL~|jZ}QeqN*RlpiXnDT|?>x zWdP72A)#D=_?JJ!HRd76bN@FjG(22#M6DWM!|nCP;cmDtsi<3Q<~%j`8`snE#qcu| z(>tM6z{fI)Pf+34~hU5l`VA z7y3M2n>TP3+v+!jJUNhzUu=4?^7tWpsa5$QZCYckRRcizltpIEqy9t30u@tA((39r z4~n~|Ly}1t0Zb-?9s?NKpOqDa2ktSi&R1j|a zb{8@}HOyEy3tIKv4TQUrS~Sc@qKD02hoDZgbJs;p;j52Z+uq>OWePZ<8w|nV-A@#X zkZm|j{{GE9;{hf^YV>t)CdA82-GCKNU33PzX4LJ}_O$x5z|<%XZC^V-{3)ItUqeF{ z{xG}Sl~sP)ulGV?>Ac1;!M%aYubWPDCIoq6jPDl_1)3ch29e%sQ-;OM8qfZ+vBcY; zdmY0)I4}?ja7lgr{OEwhPJlEAoUO?U4HjUDYpX-`#@k+_p=JHrnG&?hTg-T6Lj7&} zQg`xW1PzV6>0)4Y!?`0-GgPH#+4gN0MC48An|GunVci<<^5RGoO7GE7h##=qt$XJ9 z125b!`-kpK9$~TgbPIZx7+*O8HiDO3FMDWHj29F_Q)u$cS~2nf&O@Z^A7Zn7jJ6f> zOV_hnYZdh3%=y?z!%a;n>_JdB`D&HZo}LH&a4?_9zIbTZ`_C!b>~4ndfcC>)K*nfk0$haN_6D zv7c&LrRPA%<~iXfaXIX>l85$q5K2_Pa8D8K&_CxQ4`Abtb@Ap)q*4`~LiMh)4*hlg9;R5hQr zs+iO7PPdDe#Z`1oM3l>ay_S!CS}NQ0y-=!43^!lW)YO+5zh&_J2t(k!padu9 zoiLYSLCeBY+VMR|Ln3k?aXDnsKV})iA&mFKGIR4JzxM3SiaSvx82qabm9qS+#D_rC z;Q5%*t*G!cczr~Vi`}k{5|E`L7RpxRC8s144>O zMHgC#6PH$7v;~Ya9*@12b6_3Vxhdf3)xuC7a-#oQ7cpXcVghCTxmYs}3?RnJ)dRv?2zGshDa}5ikg~(jWY%?7zW6fmFf#0oZjyP~$|?G4 zceIM1ZOIHJ%-nmrkPhtbCZ}oqJev{`NApi6^Or7`otIsG0>5@oNoToK_)e}%0B~Xf z_HS`lS1y2qW%zh6jCW;_AsJ9EAbOayn&vJP{&0I`=9`r&p}kDcU9zwL%=9r4x$d6u zw)EvU%dxvlNu^bZ(5s&QxopFkqa0OT-rZ}BcQ37_GYVb&LWu>DW5_`VuAND!c>xmI z+Jqp#CyuN?DQ{wAslBp!aA+3lotHd{s&of#{aORzdrnP$e!SAE-;xEScv7+>`Flal zQV1GV5y}GKD?26t`^Vwfkl(sKHR903+ zFAbTE8KJ6#U(1B#>;!)InlS+6W|Nz}oE;wB)+^>v;WXeb#m$}C<@dC;e>Vgt9n=<6 zps0)sdVYo#u6#~V<7dz8n%K}_#<-^0AKcgeK4b0#a`c`%m-a*9r;+j?iMV2(oCRTf{@8-uP`vct z_aaD5!2KB=RC+n`IEG!Wlc&hi7tzj?e)M7G-f0fb9b4o3>tE3u_`D5fB>c!~Rn^FW zqa@)|(OCQ%;H$?m;u@=86w;qqdz4H6pXSawD2}(^@&ppxAp{sC3GVLh&R~Jy!3h%F zEkT33y9Wp!Y;bpXg8QI@J8b{%d+V*cx9Zl`*8a2e?@V<~KTmhp%sJiVx)j*ors$?~`oLSt zfb!!+787*aKV3dw=R9i`;~@WIdp0VIB4kP^7a^7{SCSxm)3Q42S^^Q*!?&v#FMT?E z;d(L<2{C?xFRG)Hf{=J4bi0b;28D*Y2*F_mX-YkQbneL5sxF2X#;hjYgGVx*_5FZ8 zYHvr~V6XG%AYN$LQAd@qK6L$1S;>H)sc=?9%WKNVlt+B~{Y_|r?w%pJ6+wmGy9d(m z16e#%-CM8!-eeX*Ag_{{=P%X^&YUqW;OQ6JM8OLfb@--qDEoW~)eQzX@YnY!qg*AWyOT$j3O)?Kw?zzPvT4M4}nm(Zk&H+G7g}l2>fD#}C1DsDY&Q-KICb z6dCorZlrKK>!DZ(6f))P_6l5&!fWo0{F!woDe0D{-fVn*GFrT}A#)=fK4J7b`+P{F$7NUOX*k-`sXfG)zlR2P|nC&<1LCG>J}@@_qgd zd1t`S)mCJ|%hkvW0-(Ng}H2?yYv-2f6 zcEX+sTdrS0$k}w$4 z40#+!ss#d6&sKS#@B$f>!DLT6z7W0V?|^t(j+$#Ygr1cql)hM-y;Yb>7ZG+NBmG(q zygIm`8hZQlPzgJ*>>n9+BWz1TBYFUBcNfhcwg#i*tVU~nxZX(Il2mvi_Y3`QNo$z_R+!FcG77nml?g<6BT*cBSy1k96DCGcp>JL6@Ktny7fk4{B};9xWq)ZDb84aWR8U za75ak7}2IM^VxY=CgK~;@RHhINZ%an4*P{{Z_gBY6qx^UT!vEynIR=#Oa*TyQFXoO zA?WUnn)pf78a_|IgB>r^+6OyF{Z~!p?1YBB|>TF{+U4P+E5?j$QHoN?Qb`aPK+f?6>aEl~8^CFnTmpvEjel zRl2!wJ^FiD<-1t?@Vjvq3yWBIuM2)Z3YTU>i~EKq-j_f_u_vLlycHXr8$Lb^Wo9q% zt|z9=(g@4naMtJEeh)g5dOUCbW8XOfe%}Xe<(B~w>Ie&SM`Sx&KAWhY^KpYgx%c~ z)lDC7wWe>U8cH`iQ*E>-_h-qFg4D_OgUroKk3k`dEknp8KXkKSN!|a8C2x22kjQm8 zvL7|a?Be1K7x@0SPS}jg?=@HWfV27b+-mmZ?vOcq(XV-D{#j(AGGj#;rkR&}Z9D`u zmXng(Z*@qDq%mJE8BdSfGenogB~Ii@ow)@O1lWv+OfI7>wToReKd~J!^PF#j(A-U~ z^%s(bx(>QtissL#Hz1RgU=rCBi;Epx&494dM-EGym(lB>`u!QVn;J_kzT}&Lbp9xx zyAL9^qte#a+ShArbPBYU6*fDNw%6Cv^kEDos;SKAFcQrKu1^UXR@D#n7LOz8(06#Z z4L-eJVO$*UW;RIMe(PEqEFqr^Wj;xLI6y;OVve0w)Hi#(!*#z#t)@vu1oGRRK8?z6 z&e-nwwtE>xHS$RJQUiavymQ0438@^o`YRJ;khjBZjaF|&a?g6|R~6G>E;4pS`V{k0 zXIKv7aTR_QqmxCag`wpgkhee4!~i^3sQ5b&Qi0Liy3|Vml*{Q!!QJ09Zr7iqma9=Z zaS&-Cqd@xkl79v;`x2`crI?Kx2q#MtX%mSR>x;4^sFSyjx4=2c3~?*|lg51o^Ld(d zs)tOxUzgfv7k=uLNS3gD;k0DU(tm;fmI+m9Ou8zzs^Wh&D6Suh>!bgAfUt57Q0ccMw<7Vf_YIar1dq-B02kk+`j${ZC8xHr9uBb~l;QVc!&_@hC_o-v?rSU6x0XzUW_~8m(E@ZRzq}4pY%$T&}R_YwGkjX$#IR-e$YvQU6ZM{@&qth9Y)) zJ4%^_(&f@6YPlR-0>e}S)U5=GYN7J8&d&;%AcFWL=~goRt;%e<#&dw9229rZO}hd9 z8PHNYHvDs&G)X#PRw`khGiOTIUS8S89D%qHSc8zk15rnv$+Gk%zd@sJn<*34eO1j* zDxcIt#O=P-k-97??sHlJ1Y4_oj2QdROevs9PHrnz`m2;lwVz-}w?N>yM9Cez0an&a@C@=+7zLxEl`4>w~Tt}867@~DfIfDw!}Y>}2_y$*A6 zlRsak%2ep;IMZw_Zd@wtRC6cySyPkWXdl4j&)K+HrxyI^I{B zn?o=u#^_$OHYnlRh@s4IWuVT)2@ngBFYLCgHe&m;ADyn*XEnp~G+HNpWbu*`*Bz|7 z_Qz1Emb=?rBVUbf((>xhc_JriZLg?=%iFh!E|%!#N6Pj(7{6xe6Rf!SYe|b&{0B`t z4q`gK=Bt|YSbZ&MEAo#kMf~GAZFjP?#N_F`TWg!S-C zRR$V7?q&|kW#a-r`K8U4jK^jO`s++9>0>c>MM786k|TY!Ce!&HP0xmdvMH zOxVMeeoMw+9K&SI)GrbRF1O95^I$>INNE zeuad8;VB(d@XIbfRiftecpd+oDV_K{#2@;%h%gxZ)A%MzkC+N21QL8SL{cO15qV;! z{x^D-m@{-;>}qg_(Xci1ksd=iH6m`b5_a?;Aea6`=|oU&aWPL`W4wcTFbbFG&2eSG zt+iw+SR0L%l{r+UI!Gx}8@SS|LlPI*Mjiha+}iPjpQCiTS^KukZaz87_ z+0J21#}`RB%Y5r@$y;@)zS{PJ14O)d4NsT~AYT~l3M0NKIq8i3w`5gVXPs85%Eki9 ziFD)Qi8wAjd`r19EbBb9>L- zX6`A1#GCx|u_diCJ9S{6&7|pJ(TuT^mINtlE5-Bw%V`N~^&grvRpVcoKuPgDa zCWchD!EX1*^3jCDBTI&;n)S&a5sJ#YZHpI+TBY60Ka{jOu_~!KKJujsSUkqh@}V-~ z<_L~h*J@Q&ehzY7)787U{iv1=Hs5x^^SEy{q-En{rNg{98*x~U@kVf4IYX}9Z66Ci z4EM$J)}49#+tZ0~e8eYOCO)2!6)NRB_`C0fQ_a`;%{b;imlWrg#fa%*)->U7)cW>E z!c*V2l#u?_ksg%j`1>cGmNR$uZlu-T_G!$CFHUOJo`^T)^u6Yq@wE=Gz{|p60BXYE z*<9qRj{wPtL(R((jYY_XWzZy!hz;uEI%oN7OuPTF8ho*N7|n42p&Plo1tqn+lH+|N z?!1~Ni2u7U8P`!jXWpGY&gL;f7_995Ly5|Y#1-vrzwhQsabJv}Ilh}<>-W|mdBp?v zwiK?2*ug^3^ik0B5A&n1Tvl8&4$&z;oj(rgUwGF6~A`(As&h(B1w~5)aM<= z>2xEjq6b|bHUp*NiM45ar}sZIo0HE6mfwI@Pc2dT$9YKrt0+&x%2%k$!E zGd|hBIb<)ZYWCbbKK7jy;P(uOe6mxfyz4_z^wPAos}5=#xdmV9j%i zen#W=VpN(S<6*aq3cuIV)xsCe#yTW=Us_(^*PeACrhfO$k2(ZPsk5n^*j^>ME;@5| zb>!9xOIv%Ga91s4`R;EnTyM2F{Ha05E<&?Ao$;HpXwH~sJJ4OEk9G}1`0uyzuz83{ zyX-nXCuLBs*L+RcSYT0GTpB9R30azb{hy>uwo`F8Cx+&u~O* zRr*!Koz3VAjvW&0^mme`sSa;L7H*rCc+wC*G(nde;PBH~4lGJAE^~ zk2CXzZ4&0`G{3RYjA^oCDg6bt5l)esQ^;3cymh(67S$TL&%SvNy2iK0vWQKri^3Ec z+h~4V%Tj>knb@o}W^o;A+JE$e<8j4$Wo3y>+>t?*4O_VSX5+pgv|a0F&&d$pidKxH z@+YagBA`)0UEUxPwYEGq&g9OScrAY22~_cS{PFayV3Rvj|MfQt7eZ5dxGTE0dq>bg z56InoRd9E?Y&Yl)Q3_npScr0i@aPl|SsplHJ_w0kj}2f^{tOMx1&G#lI*|Yy1&A|5 zN=rnO3B?Svw0c?lU9_k2h#aKRmwEKShVqPk8U?PrQVoYT$7G$CmidTkKdR{ z9BBPs$_O`sm9@Z@rv>KjcozG$?Uq1j1G|Cvs0>Qf=Aqpxo!UaMBsp(R1KpcfKOjd6tNT@laS z(i!~UC=!#=z0-+!#y?Em!XX$kgD9SYPJ#LirC4=IpDwA}D8TDHtLe+zM-9oua{X6VPM_LMbxwU1T}2S>?I zH}urozmPU{GK8HbeX%*&<`W9{B0Y!NW+J@x*lnhT2_X9OOs?ou& zYA-~9_HQ%7)31hwKYldeJMW&c$D(z}eL*Npmu#y!Uq<_-DvqUnJTLbdUpJ{eBzKL( zAoBs9XTgy-#UpG>q;2Hj`x~24!M>p&mMQI|a59w3Pb3SiiNKl0`YOs@R(ZKUNAiti zv}W97gF9LFNDV}``vbtOJsEzh5_{99wex1!^DHJRqn8jHrCgvXZhgfaQ>{Li?+-vKU~lxO*C~VqJwfLYcPTGJJov zMYfesK38R~MDJz@`cbwVIj{~&^^}0e7N74lvTWh99I~dvn2T-Z%Dl`Znn`Ja;v&r^ z8K56eXCwRZY%}WVz*Kvr@GvzRQ&thgc0 zIeDek8q@p^=LD}XBwr?Us(c(%_gBGQtOKeIuZXwmRVL}HXZJ*n@%wT9v}z*l0E zHaZj~mNV4QGA>KF?0;T*c+x3l5a@|I)?KK##wx~FBDK8ba$~bN1CJaRZyefT#%!-UuaIO;Pg+* z6R8FR-OrZV$KO;G>D~pZ;2lVlldH*{NYvdG`|1aq{?E((?-f(=z71)MY3foYP~rL+ z%Cl(ev5=RP0|omC((bCL9|J3b$fsNh>3;`13W~?nItMc(jugQbx>Bt1&4^!KE!9Qm z`K?K|u<(j+$OE`YWPlq7P}zcm5dqpHD{-Xr$ug1F{7asY6F=)$h5_|m2UelXOA;oZ z?rvn5BbD)jqNiC)S8{qwDz9MDMe2>VtJEtfR9AM*;X7U-@t-u$qqj7C5W9C!D3msj zI)2~oRbFF7KXS$4TX_`~{BQGXeX!4VddpqNU;FQluiLKp5nV%j(e~NBQKLqtXZEi& zw&xseUNonsFYJj3lztT_27lyHqsI6siNTl4T7Yw%N6ncpI z(6W=^sf7jKFFdw@$?o6174y)O!Eqz!(ks%4;1i4`N*!V~i#Iqxf0NH%0{hpsgKZ>CX>_Zqp8*S%NW7 z#J(#^Z&nF720X>+bFGpgTREjI9W3pj_kHetX0DPY*Q)MB8EJzkk$E4qQG%pWPR7Sf3(Xf`q7w3ay zlZWFW2YFmtn!MEk!?K72-0?thL4BAsn(P>Rlx+#T-WiNtrF^`&rW1Xi&*ME_f8huc zuxsky0+#6in2Y)aN8}?izH35&!_IzW^@Uz&Lv+Sn8eF<>yhC}!NWKh*(r4g)CZ3&{ z+gX1LQu^hbHU*I<9<_+}a-v!f4rw6w^+Ad~KT5X{v7mRm#NL=l%zKKA-hy0nwJlm1 zuaD}(zG@Qi-1Dt^h$I5`d8B~Aa0#tYFO;5QUExLyVG^G~B_ll@?K{%yvw11#a3b9{ zhmN9H4gQ@LW#Ze>P&H1tx;IC(wmr*&ZuU2U|A1e@CUjoW^R~T#G@v~y$>94uIU5*O z{k++0AKY&w2!gxCWwbTg3N4z~fr5rqmrBo2E@+HkD}k89%_3=MwxX zvQ3>4+f{kY{GFYMD1t30*UIZfa^SP;E)6yHcNh0hPsoohpEl?L(-j#LlbVqc9SjC< zZf%{xV3yj)=L6gBx4jeXH@sQt?Tsao862T)s=k)WHo30*2oWF~^P4kI9dn4m3Qdi> z1AWP9%Rt0-RNyV*#)=Umhk5&8-i!u8>jO8PkH0U5@k;;)7wSx;lH1Hsw4K;0Q3#TV6)#uf%uF)jUn*=Y5hMX8dNFw0Q6l*=G&WgW;U6(s`oWYxv@3HOS@Eu@ zlpe17cqEm4%i)W+J95f)N6yq`aRaZ@I`Ev*+S0WLNmA9T2~|6)H{STzMZ)FN9*m)UEVu{sbCd~wG`F%Z7JHR#4rH)r#6n64hp zo_KplCA_0kIHQt3<^MX7#&vz4SggwH{SSRyLf01(VZG%UEn&_g5F1VvUm1xUe12(g zT%64xI8_99$Ln?g6}&SVf{4o)uRlR>|2l9hl{Z%Vv;_>*Vw{e71cL;I`Qpnz~CCqKkRD&pOW>sU-Ndt4URq$_qnGT z$%yNk`TCWXq7@EojC5U;X)R1XmLe}d6mC=LxZW}#<^JmC{r&ZkoaiFfvItjD!aGeh z8}^S6t?j{v;G&fSDYGM6^tSaKah!;Z)no|P9xE4B5FNO^_nU{`Hw7}$^L=L8dY?WM zb@deXE2IR~)$a^OD-Y8QEwPC#N_O`dbmXzNx0y#0x7oFXPM>dYO@VKCyLYItptWj~ z(bvusZ+DgZ;oAH@gxj#}O%tddvgQ49{imq?BHjz?CnI9qB8Y+#_R;!TkH9-Ma-6HR z+SK;T^^>}6Y6DR~NMIS5veoOV%YEJUL`m)g6<4NoEk^Qgaf6>=x0ke|`4)T;Sm^`R z&a0YcL2-HTi+LjRCq^ET$#e-0iFq_d9`&;r97^f@753~Ok3R)KM;0L$2WZ*&_;oUkav2Iq5NX*-I?QQieVjyZsrA-6zr5gtm8c$&jXNB+4+JJ5_q(|^b|I?y^!@d z!b{ZE+;=0XGG-9h=azhzTaYoT)Y=@F$-P^NtfNDSHXc(KqZO&Bb_}w7t~gwemPSf5 zLr_2*iK%i~-q-iz8CASzXlP>3JLxS=rU-@i1R%FFO8Pd2>T_JH^5Z7zw#Cd?0%tQM zzBDJ2Al1>0!rDeVD^&HYlws;au4QiaSCtBiF|T1j*P*cRb1CxkD^qfx%h+va{^~^= z=i{Zs4-&zDemgCWm~#NEwPY@&i*c3z@ccMeSNEiAGgD@`60+#TJg!GW+s=gciRkh- zKMR?^cqYihq7`!_yal{h;KKd4WR&xhDPgGZi+pI79u{dCX!CSdeyS75JxGFp>P%;3 zcqJ(!Dl->C7&Y@)whmpyD>kxU37=A0H-E-3lyDB9prQ8m>noeA&{?hU$L(9>Lt0Wc ziJ9EJRO&A=IB)#MM#M%x@;Cn|EtM7wKtQ>^=qO<-9v~Cj!^Zl3uakfX^6jj?g@AtX zrpYu7`fr~oS$bCQUedR?n_LP^s?dV(9m5pL#-f&kr%hCl1TSY3K1=N5EP5+y z-!jb3&jYC3zVELP(wOR0oX!cQ(u%%x3BAt@O!DRnsm1EH)~6z7PWg0`v@`a;ZRyVq6rxjV+M2Rb0Yv`!KNEku_tD@Ud;=WX?-t%j@EOEo_=zfIR`M#wp6EqB6G77~ zHUM>eM7Spial=ri1XjjOpZs$ zYlm3NT8w?uu`~gk;AYq3k9>T0UCPTU-IFcsB*LWo(|m9~E;z*uGk`+urXd4C6c}Lo zGifF&m?cfcHH#{k$B(o5o1*;}ZaEk}0I%D@7Dt5$gi1$SUOf46%f_cx3?prHe-{wcyH9%*{FRmFvu^FPr0#6F7F)@C3)))DIl?y73g|eW<4bSHR+BG zBLDfjI#@n{!AR^w;{hsdEbcz;Zdi40+NM9MbDX4#HxIvb$ok~wS1m6SQYk7kT4zm4 zl%*>Y#e_0Usi4U93LJNB4SZTs$zZ^jhlW9pkc(n`1BViR9hUu?lqW<-ESSJVSB&Uc zdGk9GBjGK+nq5K+GG(p|Ql7uwFA?YNp#fdA03+1b%$Weko@k5*u~3hZLP_28yYBigsf z-4v3rm83seaDdIP)np0({t**2+dmJRweBZ`+;T}vHW@hgXk!N&K4s#4f3Xc@&M?c} zT%R8yA&}A2BXKaPXWhAzL&xoG2mEyyk81lKQ(VXuz)Q<|+-f@Af9z|Qg0UcLp~S*H zw!_}L4mc+rF%-A7WSpN@rp)mm-XzWbW7BWE$hl9U+5Al&g-#dqRhhkYb9KQ14yi}= z--fCFHDvXFYxVz6(^CIG9sI Date: Fri, 17 Apr 2026 08:30:53 +0200 Subject: [PATCH 87/99] New translations ai.md (Spanish) --- .../current/settings/ai.md | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/settings/ai.md diff --git a/i18n/es/docusaurus-plugin-content-docs/current/settings/ai.md b/i18n/es/docusaurus-plugin-content-docs/current/settings/ai.md new file mode 100644 index 00000000000000..8b17f6d8173fc9 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/settings/ai.md @@ -0,0 +1,140 @@ +--- +id: ai +title: AI page +--- + +The AI page allows you to add, remove, or view the list of all your AI providers and their related model aliases, whether they come from local sources or internet-based services. Providers and model aliases can then be used in your code througout your 4D application, especially with the [**4D-AIKit component**](../aikit/overview.md) using the [**model aliases**](../aikit/provider-model-aliases.md) feature. + +:::tip Entrada de blog relacionada + +[Centralizing AI Providers and Model Aliases in 4D](https://blog.4d.com/centralizing-ai-providers-and-model-aliases-in-4d) + +::: + +## Managing providers + +4D supports [various AI providers](../aikit/compatible-openai.md) with an OpenAI-like API, each offering unique models and features for database needs. + +By default, the Providers list is empty. + +### Adding a provider + +To add an AI provider: + +1. Click on the **+** button at the bottom of the Providers list. +2. Enter the required [provider's configuration fields](#provider-properties), including credentials. +3. (optional) Click the **Test connection** button to make sure the provided URL and credentials are valid. + +If the connection is successful, the number of available models is displayed on the right side of the button: + +![](../assets/en/settings/ai-connection-ok.png) + +If the connection test fails, an error message is displayed (e.g. "Request failed: Not found" or "Request failed: Unauthorized"). + +4. Click **OK** to save the new provider, or **Cancel** to revert all modifications. + +### Editing a provider + +To edit or remove a provider: + +1. Select a registered provider in the list. +2. Edit the provider's information OR to remove a provider, click on the **-** button at the bottom of the Providers list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +## Provider properties + +When you select a provider in the Providers list, several properties are available. Property names in **bold** are mandatory to create a Provider. + +### Nombre + +Local name used to identify the provider in your code, for example "claude". The name must be [compliant with property names](../Concepts/identifiers.md) since it will be used in the application's code to reference the provider. + +### Base URL + +Endpoint of the provider's API, for example `https://api.openai.com/v1` or `http://localhost:11434/v1`. + +The combo box lists the main providers, you can select a value to enter the provider endpoint: + +![](../assets/en/settings/ai-base-url.png) + +### API Key + +(optional) API key for the provider. For instructions on generating an API key, please refer to your AI provider’s official documentation. Some AI providers may also require additional specific credentials. + +### Organization + +(optional, OpenAI-specific) Organization ID used by the OpenAI API. + +### Project + +(optional, OpenAI-specific) ID of the project. Each OpenAI API key is attached to a project. + +### AIProviders.json + +The provider configuration is stored in a JSON file named *AIProviders.json* located next to the active *settings.4DSettings file* within the [project folder](../Project/architecture.md), [depending on your deployment configuration](./overview.md#enabling-user-settings). + +### Deployment with an API key + +When configuring an AI provider, you need to provide your own API key. It requires an external registration for getting API keys/credentials from AI providers. + +Using the Settings dialog box, the 4D developer can define a custom **provider name** (for example "open-ai-v1") and use this custom name in the code. They can also test it using their API key. + +When the 4D application is deployed with the [User settings enabled](../settings/overview.md#enabling-user-settings), the administrator can configure the User settings by using the **same AI provider name** ("open-ai-v1") and **customize the API key** to use the customer's key. Thanks to the [User settings priority rules](../settings/overview.md#priority-of-settings), the customer settings will automatically override the developer settings. + +:::warning + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API keys and credentials from exposure to remote machines. + +::: + +## Model Aliases + +The Model Aliases page allows you to list models from registered Providers that you want to use in your code and to name them with *aliases*. Thanks to model aliases, you avoid hardcoding model names, switch models without changing your code, and keep consistency across environments. + +When using a model alias: + +- The provider is automatically resolved (see [Model resolution](../aikit/Classes/OpenAIProviders.md#model-resolution) in the 4D-AIKit documentation). +- The model ID is applied. +- All credentials and endpoints are used. + +### Adding a model alias + +:::note + +To be able to add a model alias, you must have entered at least one valid provider in the **Providers** tab. + +::: + +To add a model alias: + +1. Click on the **+** button at the bottom of the model aliases list. +2. In the **Name** column, enter the name of the alias. +3. Click on the corresponding row in the **Provider** column to display the list of available providers ([provider names](#name) you entered in the Providers page), and select the name of the provider. +4. Click on the corresponding row in the **Model** column to display the list of available models exposed by the selected provider and select the model. +5. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +![](../assets/en/settings/model-alias.png) + +### Editing a model alias + +To edit or remove an alias: + +1. Select a model alias in the list. +2. Edit the alias information OR to remove a alias, click on the **-** button at the bottom of the list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +### Using a model alias + +You can directly use the model alias name wherever a model name is required (provided that model aliases are supported). + +For example, in 4D-AIKit, you can reference a model with the syntax: *{model:"ModelName"}*, where *ModelName* is a valid model defined in the Model Aliases tab: + +```4d +var $client:=cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; \ + {model: "Chat Model"}) +``` + +### Ver también + +["Provider & Model Aliases"](../aikit/provider-model-aliases.md) in the 4D AIKit documentation. \ No newline at end of file From 7de62aa6a2cf09d474272eb3bc3ba6a33fecc9a0 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:02 +0200 Subject: [PATCH 88/99] New translations openaiproviders.md (Japanese) --- .../current/aikit/Classes/OpenAIProviders.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md new file mode 100644 index 00000000000000..45747d12665237 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md @@ -0,0 +1,186 @@ +--- +id: openaiproviders +title: OpenAIProviders +--- + +# OpenAIProviders + +## 概要 + +The `OpenAIProviders` class manages AI provider configurations by loading configuration and handling resolution of model strings in the `provider:model` format. + +For complete usage documentation, see [Provider Model Aliases](../provider-model-aliases.md). + +## 説明 + +This class enables multi-provider support by: + +- Loading provider configurations from a single JSON file +- Loading named model aliases that map to providers and model IDs +- Resolving `provider:model` syntax to full API configurations +- Resolving named model aliases by bare name to full provider + model configurations + +The `OpenAI` class automatically loads provider configurations when instantiated. + +## コンストラクター + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +``` + +Creates a new instance that loads provider configuration from the `AIProviders.json` file (see [**Configuration Files**](../provider-model-aliases.md#configuration-files) in the "Provider Model Aliases" page for details on file locations and format). + +**Important:** + +- Only the first existing file is loaded. There is no merging of multiple files. +- The configuration is read once at instantiation time. If the `AIProviders.json` file is modified afterward, those changes will not be reflected in the existing instance. You must create a new instance of `OpenAIProviders` to reload the updated configuration. + +## 効果 + +### Integration with OpenAI Class + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use model aliases with provider:model syntax +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) +``` + +### Direct Provider Access + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() + +// Get a specific provider configuration +var $config := $providers.get("openai") +// Returns: {baseURL: "...", apiKey: "...", modelAliases: [...], ...} or Null + +// Get all provider names +var $names := $providers.list() +// Returns: ["openai", "anthropic", "mistral", "local"] +``` + +## 関数 + +### get() + +**get**(*name* : Text) : Object + +Get a provider configuration by name. + +| 引数 | 型 | 説明 | +| ---- | ------ | ----------------------------------------------------- | +| *名称* | Text | The provider name | +| 戻り値 | Object | Provider configuration object, or `Null` if not found | + +#### 例題 + +```4d +var $config := $providers.get("openai") +If ($config # Null) + // Use $config.baseURL, $config.apiKey, etc. + + // We could build a client with it + var $client:=cs.AIKit.OpenAI.new($config) +End if +``` + +### list() + +**list**() : Collection + +Get all provider names. + +| 引数 | 型 | 説明 | +| --- | ---------- | ---------------------------- | +| 戻り値 | Collection | Collection of provider names | + +#### 例題 + +```4d +var $names := $providers.list() +// Returns: ["openai", "anthropic", ...] + +For each ($name; $names) + var $config := $providers.get($name) +End for each +``` + +### modelAliases() + +**modelAliases**() : Collection + +Get all configured model aliases. + +| 引数 | 型 | 説明 | +| --- | ---------- | --------------------------------- | +| 戻り値 | Collection | Collection of model alias objects | + +Each object in the collection contains: + +| プロパティ | 型 | 説明 | +| ------- | ---- | --------------------------------- | +| `名称` | Text | Model alias name | +| `プロバイダ` | Text | Provider name | +| `model` | Text | Model ID to use with the provider | + +#### 例題 + +```4d +var $models := $providers.modelAliases() +// Returns: [{name: "my-gpt", provider: "openai", model: "gpt-5.1"}, ...] + +For each ($model; $models) + // $m.name, $m.provider, $m.model +End for each +``` + +## Model Resolution + +Two syntaxes are supported for model resolution: + +### Provider alias (`provider:model`) + +Specify the provider and model name directly: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +``` + +This is resolved internally to: + +1. Split `"openai:gpt-5.1"` into provider=`"openai"` and model=`"gpt-5.1"` +2. Look up the `"openai"` provider configuration +3. Extract `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**例題:** + +- `"openai:gpt-5.1"` → Use OpenAI provider with gpt-5.1 model +- `"anthropic:claude-3-opus"` → Use Anthropic provider with claude-3-opus +- `"local:llama3"` → Use local provider with llama3 model + +### Model alias (bare name) + +Use a named model by its bare name from the `models` section of the configuration: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: ":my-gpt"}) +``` + +This is resolved internally to: + +1. Look up `"my-gpt"` in the `models` configuration +2. Find its `provider` (e.g., `"openai"`) and `model` (e.g., `"gpt-5.1"`) +3. Resolve the provider to get `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**例題:** + +- `"my-gpt"` → Use the model alias "my-gpt" (resolves to its configured provider and model) +- `"my-embedding"` → Use the model alias "my-embedding" for embedding operations + From 3731f061c069087bcd83547c5045f1a65857dd0d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:04 +0200 Subject: [PATCH 89/99] New translations provider-model-aliases.md (Japanese) --- .../current/aikit/provider-model-aliases.md | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md new file mode 100644 index 00000000000000..986065ab669709 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md @@ -0,0 +1,372 @@ +--- +id: provider-model-aliases +title: Provider & Model Aliases +--- + +# Provider & Model Aliases + +The OpenAI client supports provider and model aliases, allowing you to define provider configurations and named model aliases in JSON files and reference them using simple syntaxes. + +## 概要 + +Instead of hard-coding API endpoints and credentials in your code, you can: + +- Define provider configurations in a JSON file +- Use the `provider:model` syntax to specify a provider and model directly +- Define named model aliases that map to a provider and a model ID +- Use a named model alias by bare name (e.g., `my-gpt`) +- Switch between providers (OpenAI, Anthropic, local Ollama, etc.) easily + +## Configuration Files + +The client automatically loads provider configurations from the first existing file found (in priority order): + +| 優先順位 | 場所 | File Path | +| ------------------------ | --------- | ------------------------------------------------- | +| 1 (高) | userData | `/Settings/AIProviders.json` | +| 2 | user | `/Settings/AIProviders.json` | +| 3 (低) | structure | `/SOURCES/AIProviders.json` | + +**Important:** Only the **first existing file** is loaded. There is no merging of multiple files. + +### Configuration File Format + +```json +{ + "providers": { + "provider_name": { + "baseURL": "https://api.example.com/v1", + "apiKey": "optional-key", + "organization": "optional-org-id", + "project": "optional-project-id" + } + }, + "models": { + "model_alias_name": { + "provider": "provider_name", + "model": "actual-model-id", + } + } +} +``` + +### Provider Fields + +| フィールド | 型 | 必須 | 説明 | +| --------- | ---- | -- | -------------------------------------------------------------- | +| `baseURL` | Text | ◯ | API endpoint URL | +| `apiKey` | Text | × | API key value | +| `組織` | Text | × | Organization ID (optional, OpenAI-specific) | +| `project` | Text | × | Project ID (optional, OpenAI-specific) | + +### Model Alias Fields + +| フィールド | 型 | 必須 | 説明 | +| ------- | ---- | -- | ------------------------------------------------------------------- | +| `プロバイダ` | Text | ◯ | Name of the provider (must exist in `providers`) | +| `model` | Text | ◯ | Model ID used by the provider | + +### Example Configuration + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1" + }, + "local": { + "baseURL": "http://localhost:11434/v1" + }, + "mistral": { + "baseURL": "https://api.mistral.ai/v1", + "apiKey": "your-mistral-key" + } + }, + "models": { + "my-gpt": { + "provider": "openai", + "model": "gpt-5.1" + }, + "my-claude": { + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022" + }, + "my-embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } + } +} +``` + +## Usage in API Calls + +### Model Parameter Formats + +Two syntaxes are supported: + +| シンタックス | 説明 | +| --------------------- | ---------------------------------------------------------------------------------- | +| `provider:model_name` | Provider alias — specify provider and model directly | +| `:model_alias` | Model alias — reference a named model from the `models` configuration by bare name | + +#### Provider alias syntax + +Use the `provider:model_name` syntax in any API call that accepts a model parameter: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Chat completions +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) + +// Embeddings +var $result := $client.embeddings.create("text"; "openai:text-embedding-3-small") +var $result := $client.embeddings.create("text"; "local:nomic-embed-text") + +// Image generation +var $result := $client.images.generate("prompt"; {model: "openai:dall-e-3"}) +``` + +#### Model alias syntax + +Use a bare model name to reference a named model defined in the `models` section of the configuration file. The provider, model ID, and credentials are resolved automatically: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use a named model alias +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) +var $result := $client.chat.completions.create($messages; {model: ":my-claude"}) + +// Embeddings with a named model alias +var $result := $client.embeddings.create("text"; ":my-embedding") +``` + +### How It Works + +#### Provider alias (`provider:model`) + +When you use the `provider:model` syntax, the client automatically: + +1. **Parses** the model string to extract provider name and model name + - Example: `"openai:gpt-5.1"` → provider=`"openai"`, model=`"gpt-5.1"` + +2. **Looks up** the provider configuration from the loaded JSON file + - Retrieves `baseURL`, `apiKey`, `organization`, `project` + +3. **Makes the API request** using the resolved configuration + - Sends request to the provider's `baseURL` with the correct `apiKey` + +#### Model alias (bare name) + +When you use a bare model name that matches a configured alias, the client automatically: + +1. **Looks up** the model alias in the `models` section of the configuration + - Example: `":my-gpt"` → finds entry with `provider: "openai"`, `model: "gpt-5.1"` + +2. **Resolves** the associated provider to get `baseURL` and `apiKey` + +3. **Makes the API request** using the provider's endpoint and the stored model ID + +### Using Plain Model Names + +If you specify a model name **without** a provider prefix or `:` prefix, the client uses the configuration from its constructor: + +```4d +// Use constructor configuration +var $client := cs.AIKit.OpenAI.new({apiKey: "sk-..."; baseURL: "https://api.openai.com/v1"}) +var $result := $client.chat.completions.create($messages; {model: "gpt-5.1"}) + +// Override with provider alias +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) + +// Override with model alias (bare name) +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) + +``` + +## 例題 + +### Multi-Provider Chat Application + +```4d +var $client := cs.AIKit.OpenAI.new() +var $messages := [] +$messages.push({role: "user"; content: "What is the capital of France?"}) + +// Try OpenAI +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) + +// Try Anthropic +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-5-sonnet"}) + +// Try local Ollama +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Embeddings with Multiple Providers + +```4d +var $client := cs.AIKit.OpenAI.new() +var $text := "Hello world" + +// Use OpenAI embeddings +var $embedding1 := $client.embeddings.create($text; "openai:text-embedding-3-small") + +// Use local embeddings +var $embedding2 := $client.embeddings.create($text; "local:nomic-embed-text") +``` + +## Configuration Management + +Provider configurations can be managed through [4D Settings](https://developer.4d.com/docs/settings/ai) or by directly editing JSON files. + +**To add or modify providers:** + +1. Use 4D Settings interface (recommended), or +2. Edit the appropriate JSON file (userData, user, or structure) +3. Restart your application or create a new OpenAI client instance to load changes + +**Recommended file location:** + +- **For user-specific configs:** `/Settings/AIProviders.json` +- **For application defaults:** `/SOURCES/AIProviders.json` + +### No Reload Capability + +Once a client is instantiated, it cannot reload provider configurations. To pick up configuration changes: + +```4d +// Configuration changed - create new client +var $client := cs.AIKit.OpenAI.new() +``` + +## Security Considerations + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API tokens and credentials from exposure to client machines. + +## Common Use Cases + +### Local Development with Ollama + +```json +{ + "providers": { + "local": { + "baseURL": "http://localhost:11434/v1" + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Named Model Aliases + +Define models once, use them everywhere by name: + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + } + }, + "models": { + "chat": { + "provider": "openai", + "model": "gpt-5.1" + }, + "fast": { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022" + }, + "embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use named model aliases — no need to remember provider or model ID +var $result := $client.chat.completions.create($messages; {model: ":chat"}) +var $result := $client.chat.completions.create($messages; {model: ":fast"}) +var $embedding := $client.embeddings.create("text"; ":embedding") +``` + +### List All Configured Models + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +var $models := $providers.modelAliases() +// Returns: [{name: "chat", provider: "openai", model: "gpt-5.1"}, ...] +``` + +### Production with Multiple Cloud Providers + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + }, + "azure": { + "baseURL": "https://your-resource.openai.azure.com", + "apiKey": "your-azure-key" + } + } +} +``` + +### Provider-Specific Organizations + +```json +{ + "providers": { + "openai-team-a": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-a-id" + }, + "openai-team-b": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-b-id" + } + } +} +``` + +```4d +// Route to different organizations +var $resultA := $client.chat.completions.create($messages; {model: "openai-team-a:gpt-5.1"}) +var $resultB := $client.chat.completions.create($messages; {model: "openai-team-b:gpt-5.1"}) +``` + +## Related Documentation + +- [OpenAI Class](Classes/OpenAI.md) - Main client class +- [OpenAIProviders Class](Classes/OpenAIProviders.md) - Provider configuration management +- [Compatible OpenAI APIs](compatible-openai.md) - List of compatible providers From 7230a1484e841ad65f5ca50a7f0f4d7506dd01f5 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:05 +0200 Subject: [PATCH 90/99] New translations ai-base-url.png (Japanese) --- .../current/assets/en/settings/ai-base-url.png | Bin 0 -> 9244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png b/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd536326bf335e0726c4f2380311e2df0de08b1 GIT binary patch literal 9244 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 Date: Fri, 17 Apr 2026 08:31:06 +0200 Subject: [PATCH 91/99] New translations ai-connection-ok.png (Japanese) --- .../assets/en/settings/ai-connection-ok.png | Bin 0 -> 2082 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png b/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..132fcb58c1e5fc4a554655d4fe52fccb741d81bf GIT binary patch literal 2082 zcmV+-2;KLIP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2e(N?K~#8N?c7gD z8|fd%@%K8V2M=v3X(^=@LqL#HN{RXpbI_rpcFxn1tYnIg&r0bZ?XxLKtPHf zJT6qBcnO9C!GjozNI?i`V<`y1&i2rQIQDm#nPlckthUrK{q_3-L7(~eMDl!|@AKH^ zH(l4iAcXkkb*K$Oh+mV0fe->D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb*NMAcU|< z7ziN%_|40Ij(mK4Os!Vq=;(-(lN0r@_`y0mJL&4`;>wjP>LDSTcoqi7$H#p5@PV5* zZ{qj+>FAK6dT1)dGaK*7%5W3 zG>u5BI=kr_lWU0*S)hJpK7p3VJC3`rN#ye+?CV_X8ArQP@;jduStyfFXv9*GirLRr zsvB3IofU+2UOv&{*bnk(gz3sC!|Q6nTVZK&n5F7zKNm^X%kxHiWqr6s$?h)clXm6d zT%On^cXf$jWyw-mA8ye3)T*HP(noT;(ck2@v!Bk_r1W1Y@ry4VuR(q5wR$Zs zr~D2sNt=d2nT5zxcwsFej2y(wfs%hdMSsq2pC?L`c_T-hI61?h&{SvVN%SrE-7LwW9G43oYXT%ko^#0=4MMgsfNDc zOJ`@-@{Z{??xm{z_GlDZFB2R!4uFrd04TO$L2dr}PkJO6HKStPi{UAAwP8U{}_M z8P(JEVZOjV`CyX`4{ojN@He@=j!_w(XluiyZiNX<2f@> zAj(*LgWY|gTxQFvPBcwJ>z!g_W0!r(|={>Z{&-hR=JzDLK1 zZ|u_O-H&3gzgMAfjzFjuStiYt@`f(%XPACq4(f*Yy!p7v%)j=mI7)^Rm1=;1Zsxv@-m^O=ekWttYGO55Mr7?t@{P8hwA6N{{-nF$9*16 zk!G1vTKlFN&%}?*`yO{ia479AkE=QY&0p=Uto@EUK!`fU6 zP8KkX7x2_wzMrOC-eU0nJ+=8_I5t2VRmeWO8~p^;g5{?XW-c;KX8(-+@7fzSeF0_g zRjB9#^!Z(lmg&X@rK6Gv|E{CYj_}G+S_g*K&}TES-dv`)R-sr8F>;|ZZH0=iwz&;F zEID4ET@^WWkFz$blVSQBDzJ;wreSc8`-AS%+%3pt!7Sfb&Pan`bONTHDwRZ#V1J63 zV_8sMct$EdX3hBDAsD28V~XcZ{fRObcR%Y)_wFlw&hvZf3yx+`wZ?kbbxR-%&e>H<-7FV$nf{6Goranv1eeDS*ffBGQ6_Z_ovRN z)gsIEaaV2s4tK99{ol?q!xO^Y)@!qt6Ija`dzlcp9%A!#_8h@wh241q_ky))7zCLt zY|Vg1vA1d!{1F{9cx= zSfhXT=A!y6yN}VaxMKs+p{dU?$a(l@$4682?KC#FLe(dftXVA_O2cb&FTuC|hR_ZB zqA+vT+S|O&Eb9Y9YpnWa2-zEHFN@Z|UL|DTr(Oj(H`GEbcV`&yc5l*+vU>K~x@DE} zeVY1TfK_WRBQTU9tv8keudX$g2|Svk^svOJeO;@W-?_n9fK|0}@R(=+h57B)_8 zKy4Nt*xA{kr>9447Q&@XD+3{f*E|b@j*bot!%&;W1(V;oI4{q_;Of<@@*x|S;N!=S zbar;C%|bNsEDY>V+^N-SGFy4TFbob34mdbCpsTA(JuE~M&o&UTJ_qsLyLTKO9`faj zXOI0QX`06M>(}Y&>5D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb)Dy58p?k)fiB|0ssI2 M07*qoM6N<$f(qCA!vFvP literal 0 HcmV?d00001 From 8a358435f8bf38cdad0ce9747282e8fc592ee1cd Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:08 +0200 Subject: [PATCH 92/99] New translations model-alias.png (Japanese) --- .../current/assets/en/settings/model-alias.png | Bin 0 -> 46721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png b/i18n/ja/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png new file mode 100644 index 0000000000000000000000000000000000000000..7af048330e16aa44a41982ff4f3cc23807254183 GIT binary patch literal 46721 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 Date: Fri, 17 Apr 2026 08:31:09 +0200 Subject: [PATCH 93/99] New translations ai.md (Japanese) --- .../current/settings/ai.md | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/settings/ai.md diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/settings/ai.md b/i18n/ja/docusaurus-plugin-content-docs/current/settings/ai.md new file mode 100644 index 00000000000000..e48b38cdca7577 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/settings/ai.md @@ -0,0 +1,140 @@ +--- +id: ai +title: AI page +--- + +The AI page allows you to add, remove, or view the list of all your AI providers and their related model aliases, whether they come from local sources or internet-based services. Providers and model aliases can then be used in your code througout your 4D application, especially with the [**4D-AIKit component**](../aikit/overview.md) using the [**model aliases**](../aikit/provider-model-aliases.md) feature. + +:::tip 関連したblog 記事 + +[Centralizing AI Providers and Model Aliases in 4D](https://blog.4d.com/centralizing-ai-providers-and-model-aliases-in-4d) + +::: + +## Managing providers + +4D supports [various AI providers](../aikit/compatible-openai.md) with an OpenAI-like API, each offering unique models and features for database needs. + +By default, the Providers list is empty. + +### Adding a provider + +To add an AI provider: + +1. Click on the **+** button at the bottom of the Providers list. +2. Enter the required [provider's configuration fields](#provider-properties), including credentials. +3. (optional) Click the **Test connection** button to make sure the provided URL and credentials are valid. + +If the connection is successful, the number of available models is displayed on the right side of the button: + +![](../assets/en/settings/ai-connection-ok.png) + +If the connection test fails, an error message is displayed (e.g. "Request failed: Not found" or "Request failed: Unauthorized"). + +4. Click **OK** to save the new provider, or **Cancel** to revert all modifications. + +### Editing a provider + +To edit or remove a provider: + +1. Select a registered provider in the list. +2. Edit the provider's information OR to remove a provider, click on the **-** button at the bottom of the Providers list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +## Provider properties + +When you select a provider in the Providers list, several properties are available. Property names in **bold** are mandatory to create a Provider. + +### 名称 + +Local name used to identify the provider in your code, for example "claude". The name must be [compliant with property names](../Concepts/identifiers.md) since it will be used in the application's code to reference the provider. + +### Base URL + +Endpoint of the provider's API, for example `https://api.openai.com/v1` or `http://localhost:11434/v1`. + +The combo box lists the main providers, you can select a value to enter the provider endpoint: + +![](../assets/en/settings/ai-base-url.png) + +### API Key + +(optional) API key for the provider. For instructions on generating an API key, please refer to your AI provider’s official documentation. Some AI providers may also require additional specific credentials. + +### 組織 + +(optional, OpenAI-specific) Organization ID used by the OpenAI API. + +### Project + +(optional, OpenAI-specific) ID of the project. Each OpenAI API key is attached to a project. + +### AIProviders.json + +The provider configuration is stored in a JSON file named *AIProviders.json* located next to the active *settings.4DSettings file* within the [project folder](../Project/architecture.md), [depending on your deployment configuration](./overview.md#enabling-user-settings). + +### Deployment with an API key + +When configuring an AI provider, you need to provide your own API key. It requires an external registration for getting API keys/credentials from AI providers. + +Using the Settings dialog box, the 4D developer can define a custom **provider name** (for example "open-ai-v1") and use this custom name in the code. They can also test it using their API key. + +When the 4D application is deployed with the [User settings enabled](../settings/overview.md#enabling-user-settings), the administrator can configure the User settings by using the **same AI provider name** ("open-ai-v1") and **customize the API key** to use the customer's key. Thanks to the [User settings priority rules](../settings/overview.md#priority-of-settings), the customer settings will automatically override the developer settings. + +:::warning + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API keys and credentials from exposure to remote machines. + +::: + +## Model Aliases + +The Model Aliases page allows you to list models from registered Providers that you want to use in your code and to name them with *aliases*. Thanks to model aliases, you avoid hardcoding model names, switch models without changing your code, and keep consistency across environments. + +When using a model alias: + +- The provider is automatically resolved (see [Model resolution](../aikit/Classes/OpenAIProviders.md#model-resolution) in the 4D-AIKit documentation). +- The model ID is applied. +- All credentials and endpoints are used. + +### Adding a model alias + +:::note + +To be able to add a model alias, you must have entered at least one valid provider in the **Providers** tab. + +::: + +To add a model alias: + +1. Click on the **+** button at the bottom of the model aliases list. +2. In the **Name** column, enter the name of the alias. +3. Click on the corresponding row in the **Provider** column to display the list of available providers ([provider names](#name) you entered in the Providers page), and select the name of the provider. +4. Click on the corresponding row in the **Model** column to display the list of available models exposed by the selected provider and select the model. +5. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +![](../assets/en/settings/model-alias.png) + +### Editing a model alias + +To edit or remove an alias: + +1. Select a model alias in the list. +2. Edit the alias information OR to remove a alias, click on the **-** button at the bottom of the list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +### Using a model alias + +You can directly use the model alias name wherever a model name is required (provided that model aliases are supported). + +For example, in 4D-AIKit, you can reference a model with the syntax: *{model:"ModelName"}*, where *ModelName* is a valid model defined in the Model Aliases tab: + +```4d +var $client:=cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; \ + {model: "Chat Model"}) +``` + +### 参照 + +["Provider & Model Aliases"](../aikit/provider-model-aliases.md) in the 4D AIKit documentation. \ No newline at end of file From e141bb0c37a4df148d28f54c092d5b10d6bb5ea1 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:17 +0200 Subject: [PATCH 94/99] New translations openaiproviders.md (Portuguese, Brazilian) --- .../current/aikit/Classes/OpenAIProviders.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md new file mode 100644 index 00000000000000..be38db228be8c4 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIProviders.md @@ -0,0 +1,186 @@ +--- +id: openaiproviders +title: OpenAIProviders +--- + +# OpenAIProviders + +## Resumo + +The `OpenAIProviders` class manages AI provider configurations by loading configuration and handling resolution of model strings in the `provider:model` format. + +For complete usage documentation, see [Provider Model Aliases](../provider-model-aliases.md). + +## Descrição + +This class enables multi-provider support by: + +- Loading provider configurations from a single JSON file +- Loading named model aliases that map to providers and model IDs +- Resolving `provider:model` syntax to full API configurations +- Resolving named model aliases by bare name to full provider + model configurations + +The `OpenAI` class automatically loads provider configurations when instantiated. + +## Constructor + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +``` + +Creates a new instance that loads provider configuration from the `AIProviders.json` file (see [**Configuration Files**](../provider-model-aliases.md#configuration-files) in the "Provider Model Aliases" page for details on file locations and format). + +**Important:** + +- Only the first existing file is loaded. There is no merging of multiple files. +- The configuration is read once at instantiation time. If the `AIProviders.json` file is modified afterward, those changes will not be reflected in the existing instance. You must create a new instance of `OpenAIProviders` to reload the updated configuration. + +## Utilização + +### Integration with OpenAI Class + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use model aliases with provider:model syntax +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) +``` + +### Direct Provider Access + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() + +// Get a specific provider configuration +var $config := $providers.get("openai") +// Returns: {baseURL: "...", apiKey: "...", modelAliases: [...], ...} or Null + +// Get all provider names +var $names := $providers.list() +// Returns: ["openai", "anthropic", "mistral", "local"] +``` + +## Funções + +### get() + +**get**(*name* : Text) : Object + +Get a provider configuration by name. + +| Parâmetro | Tipo | Descrição | +| --------- | ------ | ----------------------------------------------------- | +| *name* | Text | The provider name | +| Resultado | Object | Provider configuration object, or `Null` if not found | + +#### Exemplo + +```4d +var $config := $providers.get("openai") +If ($config # Null) + // Use $config.baseURL, $config.apiKey, etc. + + // We could build a client with it + var $client:=cs.AIKit.OpenAI.new($config) +End if +``` + +### lista() + +**list**() : Collection + +Get all provider names. + +| Parâmetro | Tipo | Descrição | +| --------- | ---------- | ---------------------------- | +| Resultado | Collection | Collection of provider names | + +#### Exemplo + +```4d +var $names := $providers.list() +// Returns: ["openai", "anthropic", ...] + +For each ($name; $names) + var $config := $providers.get($name) +End for each +``` + +### modelAliases() + +**modelAliases**() : Collection + +Get all configured model aliases. + +| Parâmetro | Tipo | Descrição | +| --------- | ---------- | --------------------------------- | +| Resultado | Collection | Collection of model alias objects | + +Each object in the collection contains: + +| Propriedade | Tipo | Descrição | +| ----------- | ---- | --------------------------------- | +| `name` | Text | Model alias name | +| `provider` | Text | Provider name | +| `model` | Text | Model ID to use with the provider | + +#### Exemplo + +```4d +var $models := $providers.modelAliases() +// Returns: [{name: "my-gpt", provider: "openai", model: "gpt-5.1"}, ...] + +For each ($model; $models) + // $m.name, $m.provider, $m.model +End for each +``` + +## Model Resolution + +Two syntaxes are supported for model resolution: + +### Provider alias (`provider:model`) + +Specify the provider and model name directly: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +``` + +This is resolved internally to: + +1. Split `"openai:gpt-5.1"` into provider=`"openai"` and model=`"gpt-5.1"` +2. Look up the `"openai"` provider configuration +3. Extract `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Exemplos:** + +- `"openai:gpt-5.1"` → Use OpenAI provider with gpt-5.1 model +- `"anthropic:claude-3-opus"` → Use Anthropic provider with claude-3-opus +- `"local:llama3"` → Use local provider with llama3 model + +### Model alias (bare name) + +Use a named model by its bare name from the `models` section of the configuration: + +```4d +var $client := cs.AIKit.OpenAI.new() +$client.chat.completions.create($messages; {model: ":my-gpt"}) +``` + +This is resolved internally to: + +1. Look up `"my-gpt"` in the `models` configuration +2. Find its `provider` (e.g., `"openai"`) and `model` (e.g., `"gpt-5.1"`) +3. Resolve the provider to get `baseURL` and `apiKey` +4. Make the API request using the resolved configuration + +**Exemplos:** + +- `"my-gpt"` → Use the model alias "my-gpt" (resolves to its configured provider and model) +- `"my-embedding"` → Use the model alias "my-embedding" for embedding operations + From 1e6e8fdb9ee7c1842ae86bcf740d6ab7e9932c03 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:19 +0200 Subject: [PATCH 95/99] New translations provider-model-aliases.md (Portuguese, Brazilian) --- .../current/aikit/provider-model-aliases.md | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md new file mode 100644 index 00000000000000..b99a4383f69cd0 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/aikit/provider-model-aliases.md @@ -0,0 +1,372 @@ +--- +id: provider-model-aliases +title: Provider & Model Aliases +--- + +# Provider & Model Aliases + +The OpenAI client supports provider and model aliases, allowing you to define provider configurations and named model aliases in JSON files and reference them using simple syntaxes. + +## Visão Geral + +Instead of hard-coding API endpoints and credentials in your code, you can: + +- Define provider configurations in a JSON file +- Use the `provider:model` syntax to specify a provider and model directly +- Define named model aliases that map to a provider and a model ID +- Use a named model alias by bare name (e.g., `my-gpt`) +- Switch between providers (OpenAI, Anthropic, local Ollama, etc.) easily + +## Configuration Files + +The client automatically loads provider configurations from the first existing file found (in priority order): + +| Prioridade | Localização | File Path | +| --------------------------------- | ----------- | ------------------------------------------------- | +| 1 (mais alto) | userData | `/Settings/AIProviders.json` | +| 2 | user | `/Settings/AIProviders.json` | +| 3 (mais baixo) | structure | `/SOURCES/AIProviders.json` | + +**Important:** Only the **first existing file** is loaded. There is no merging of multiple files. + +### Configuration File Format + +```json +{ + "providers": { + "provider_name": { + "baseURL": "https://api.example.com/v1", + "apiKey": "optional-key", + "organization": "optional-org-id", + "project": "optional-project-id" + } + }, + "models": { + "model_alias_name": { + "provider": "provider_name", + "model": "actual-model-id", + } + } +} +``` + +### Provider Fields + +| Campo | Tipo | Required | Descrição | +| -------------- | ---- | -------- | -------------------------------------------------------------- | +| `baseURL` | Text | Sim | API endpoint URL | +| `apiKey` | Text | Não | API key value | +| `organization` | Text | Não | Organization ID (optional, OpenAI-specific) | +| `project` | Text | Não | Project ID (optional, OpenAI-specific) | + +### Model Alias Fields + +| Campo | Tipo | Required | Descrição | +| ---------- | ---- | -------- | ------------------------------------------------------------------- | +| `provider` | Text | Sim | Name of the provider (must exist in `providers`) | +| `model` | Text | Sim | Model ID used by the provider | + +### Example Configuration + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1" + }, + "local": { + "baseURL": "http://localhost:11434/v1" + }, + "mistral": { + "baseURL": "https://api.mistral.ai/v1", + "apiKey": "your-mistral-key" + } + }, + "models": { + "my-gpt": { + "provider": "openai", + "model": "gpt-5.1" + }, + "my-claude": { + "provider": "anthropic", + "model": "claude-3-5-sonnet-20241022" + }, + "my-embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } + } +} +``` + +## Usage in API Calls + +### Model Parameter Formats + +Two syntaxes are supported: + +| Sintaxe | Descrição | +| --------------------- | ---------------------------------------------------------------------------------- | +| `provider:model_name` | Provider alias — specify provider and model directly | +| `:model_alias` | Model alias — reference a named model from the `models` configuration by bare name | + +#### Provider alias syntax + +Use the `provider:model_name` syntax in any API call that accepts a model parameter: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Chat completions +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) +var $result := $client.chat.completions.create($messages; {model: "local:llama3"}) + +// Embeddings +var $result := $client.embeddings.create("text"; "openai:text-embedding-3-small") +var $result := $client.embeddings.create("text"; "local:nomic-embed-text") + +// Image generation +var $result := $client.images.generate("prompt"; {model: "openai:dall-e-3"}) +``` + +#### Model alias syntax + +Use a bare model name to reference a named model defined in the `models` section of the configuration file. The provider, model ID, and credentials are resolved automatically: + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use a named model alias +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) +var $result := $client.chat.completions.create($messages; {model: ":my-claude"}) + +// Embeddings with a named model alias +var $result := $client.embeddings.create("text"; ":my-embedding") +``` + +### How It Works + +#### Provider alias (`provider:model`) + +When you use the `provider:model` syntax, the client automatically: + +1. **Parses** the model string to extract provider name and model name + - Example: `"openai:gpt-5.1"` → provider=`"openai"`, model=`"gpt-5.1"` + +2. **Looks up** the provider configuration from the loaded JSON file + - Retrieves `baseURL`, `apiKey`, `organization`, `project` + +3. **Makes the API request** using the resolved configuration + - Sends request to the provider's `baseURL` with the correct `apiKey` + +#### Model alias (bare name) + +When you use a bare model name that matches a configured alias, the client automatically: + +1. **Looks up** the model alias in the `models` section of the configuration + - Example: `":my-gpt"` → finds entry with `provider: "openai"`, `model: "gpt-5.1"` + +2. **Resolves** the associated provider to get `baseURL` and `apiKey` + +3. **Makes the API request** using the provider's endpoint and the stored model ID + +### Using Plain Model Names + +If you specify a model name **without** a provider prefix or `:` prefix, the client uses the configuration from its constructor: + +```4d +// Use constructor configuration +var $client := cs.AIKit.OpenAI.new({apiKey: "sk-..."; baseURL: "https://api.openai.com/v1"}) +var $result := $client.chat.completions.create($messages; {model: "gpt-5.1"}) + +// Override with provider alias +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-opus"}) + +// Override with model alias (bare name) +var $result := $client.chat.completions.create($messages; {model: ":my-gpt"}) + +``` + +## Exemplos + +### Multi-Provider Chat Application + +```4d +var $client := cs.AIKit.OpenAI.new() +var $messages := [] +$messages.push({role: "user"; content: "What is the capital of France?"}) + +// Try OpenAI +var $result := $client.chat.completions.create($messages; {model: "openai:gpt-5.1"}) + +// Try Anthropic +var $result := $client.chat.completions.create($messages; {model: "anthropic:claude-3-5-sonnet"}) + +// Try local Ollama +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Embeddings with Multiple Providers + +```4d +var $client := cs.AIKit.OpenAI.new() +var $text := "Hello world" + +// Use OpenAI embeddings +var $embedding1 := $client.embeddings.create($text; "openai:text-embedding-3-small") + +// Use local embeddings +var $embedding2 := $client.embeddings.create($text; "local:nomic-embed-text") +``` + +## Configuration Management + +Provider configurations can be managed through [4D Settings](https://developer.4d.com/docs/settings/ai) or by directly editing JSON files. + +**To add or modify providers:** + +1. Use 4D Settings interface (recommended), or +2. Edit the appropriate JSON file (userData, user, or structure) +3. Restart your application or create a new OpenAI client instance to load changes + +**Recommended file location:** + +- **For user-specific configs:** `/Settings/AIProviders.json` +- **For application defaults:** `/SOURCES/AIProviders.json` + +### No Reload Capability + +Once a client is instantiated, it cannot reload provider configurations. To pick up configuration changes: + +```4d +// Configuration changed - create new client +var $client := cs.AIKit.OpenAI.new() +``` + +## Security Considerations + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API tokens and credentials from exposure to client machines. + +## Common Use Cases + +### Local Development with Ollama + +```json +{ + "providers": { + "local": { + "baseURL": "http://localhost:11434/v1" + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; {model: "local:llama3.2"}) +``` + +### Named Model Aliases + +Define models once, use them everywhere by name: + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + } + }, + "models": { + "chat": { + "provider": "openai", + "model": "gpt-5.1" + }, + "fast": { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022" + }, + "embedding": { + "provider": "openai", + "model": "text-embedding-3-small", + } + } +} +``` + +```4d +var $client := cs.AIKit.OpenAI.new() + +// Use named model aliases — no need to remember provider or model ID +var $result := $client.chat.completions.create($messages; {model: ":chat"}) +var $result := $client.chat.completions.create($messages; {model: ":fast"}) +var $embedding := $client.embeddings.create("text"; ":embedding") +``` + +### List All Configured Models + +```4d +var $providers := cs.AIKit.OpenAIProviders.new() +var $models := $providers.modelAliases() +// Returns: [{name: "chat", provider: "openai", model: "gpt-5.1"}, ...] +``` + +### Production with Multiple Cloud Providers + +```json +{ + "providers": { + "openai": { + "baseURL": "https://api.openai.com/v1", + "apiKey": "your-openai-key" + }, + "anthropic": { + "baseURL": "https://api.anthropic.com/v1", + "apiKey": "your-anthropic-key" + }, + "azure": { + "baseURL": "https://your-resource.openai.azure.com", + "apiKey": "your-azure-key" + } + } +} +``` + +### Provider-Specific Organizations + +```json +{ + "providers": { + "openai-team-a": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-a-id" + }, + "openai-team-b": { + "baseURL": "https://api.openai.com/v1", + "organization": "org-team-b-id" + } + } +} +``` + +```4d +// Route to different organizations +var $resultA := $client.chat.completions.create($messages; {model: "openai-team-a:gpt-5.1"}) +var $resultB := $client.chat.completions.create($messages; {model: "openai-team-b:gpt-5.1"}) +``` + +## Related Documentation + +- [OpenAI Class](Classes/OpenAI.md) - Main client class +- [OpenAIProviders Class](Classes/OpenAIProviders.md) - Provider configuration management +- [Compatible OpenAI APIs](compatible-openai.md) - List of compatible providers From 66383c89a3a0e330dbefc58c3e4e027f5585d179 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:20 +0200 Subject: [PATCH 96/99] New translations ai-base-url.png (Portuguese, Brazilian) --- .../current/assets/en/settings/ai-base-url.png | Bin 0 -> 9244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png b/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-base-url.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd536326bf335e0726c4f2380311e2df0de08b1 GIT binary patch literal 9244 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 Date: Fri, 17 Apr 2026 08:31:21 +0200 Subject: [PATCH 97/99] New translations ai-connection-ok.png (Portuguese, Brazilian) --- .../assets/en/settings/ai-connection-ok.png | Bin 0 -> 2082 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png b/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/ai-connection-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..132fcb58c1e5fc4a554655d4fe52fccb741d81bf GIT binary patch literal 2082 zcmV+-2;KLIP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2e(N?K~#8N?c7gD z8|fd%@%K8V2M=v3X(^=@LqL#HN{RXpbI_rpcFxn1tYnIg&r0bZ?XxLKtPHf zJT6qBcnO9C!GjozNI?i`V<`y1&i2rQIQDm#nPlckthUrK{q_3-L7(~eMDl!|@AKH^ zH(l4iAcXkkb*K$Oh+mV0fe->D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb*NMAcU|< z7ziN%_|40Ij(mK4Os!Vq=;(-(lN0r@_`y0mJL&4`;>wjP>LDSTcoqi7$H#p5@PV5* zZ{qj+>FAK6dT1)dGaK*7%5W3 zG>u5BI=kr_lWU0*S)hJpK7p3VJC3`rN#ye+?CV_X8ArQP@;jduStyfFXv9*GirLRr zsvB3IofU+2UOv&{*bnk(gz3sC!|Q6nTVZK&n5F7zKNm^X%kxHiWqr6s$?h)clXm6d zT%On^cXf$jWyw-mA8ye3)T*HP(noT;(ck2@v!Bk_r1W1Y@ry4VuR(q5wR$Zs zr~D2sNt=d2nT5zxcwsFej2y(wfs%hdMSsq2pC?L`c_T-hI61?h&{SvVN%SrE-7LwW9G43oYXT%ko^#0=4MMgsfNDc zOJ`@-@{Z{??xm{z_GlDZFB2R!4uFrd04TO$L2dr}PkJO6HKStPi{UAAwP8U{}_M z8P(JEVZOjV`CyX`4{ojN@He@=j!_w(XluiyZiNX<2f@> zAj(*LgWY|gTxQFvPBcwJ>z!g_W0!r(|={>Z{&-hR=JzDLK1 zZ|u_O-H&3gzgMAfjzFjuStiYt@`f(%XPACq4(f*Yy!p7v%)j=mI7)^Rm1=;1Zsxv@-m^O=ekWttYGO55Mr7?t@{P8hwA6N{{-nF$9*16 zk!G1vTKlFN&%}?*`yO{ia479AkE=QY&0p=Uto@EUK!`fU6 zP8KkX7x2_wzMrOC-eU0nJ+=8_I5t2VRmeWO8~p^;g5{?XW-c;KX8(-+@7fzSeF0_g zRjB9#^!Z(lmg&X@rK6Gv|E{CYj_}G+S_g*K&}TES-dv`)R-sr8F>;|ZZH0=iwz&;F zEID4ET@^WWkFz$blVSQBDzJ;wreSc8`-AS%+%3pt!7Sfb&Pan`bONTHDwRZ#V1J63 zV_8sMct$EdX3hBDAsD28V~XcZ{fRObcR%Y)_wFlw&hvZf3yx+`wZ?kbbxR-%&e>H<-7FV$nf{6Goranv1eeDS*ffBGQ6_Z_ovRN z)gsIEaaV2s4tK99{ol?q!xO^Y)@!qt6Ija`dzlcp9%A!#_8h@wh241q_ky))7zCLt zY|Vg1vA1d!{1F{9cx= zSfhXT=A!y6yN}VaxMKs+p{dU?$a(l@$4682?KC#FLe(dftXVA_O2cb&FTuC|hR_ZB zqA+vT+S|O&Eb9Y9YpnWa2-zEHFN@Z|UL|DTr(Oj(H`GEbcV`&yc5l*+vU>K~x@DE} zeVY1TfK_WRBQTU9tv8keudX$g2|Svk^svOJeO;@W-?_n9fK|0}@R(=+h57B)_8 zKy4Nt*xA{kr>9447Q&@XD+3{f*E|b@j*bot!%&;W1(V;oI4{q_;Of<@@*x|S;N!=S zbar;C%|bNsEDY>V+^N-SGFy4TFbob34mdbCpsTA(JuE~M&o&UTJ_qsLyLTKO9`faj zXOI0QX`06M>(}Y&>5D41^Fi2?HSnNEiqqY!U`S2#_!kLf9k>gb)Dy58p?k)fiB|0ssI2 M07*qoM6N<$f(qCA!vFvP literal 0 HcmV?d00001 From cad5cc52ec3d8ac88e78100824d7e7c31991546d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 08:31:23 +0200 Subject: [PATCH 98/99] New translations model-alias.png (Portuguese, Brazilian) --- .../current/assets/en/settings/model-alias.png | Bin 0 -> 46721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png b/i18n/pt/docusaurus-plugin-content-docs/current/assets/en/settings/model-alias.png new file mode 100644 index 0000000000000000000000000000000000000000..7af048330e16aa44a41982ff4f3cc23807254183 GIT binary patch literal 46721 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 Date: Fri, 17 Apr 2026 08:31:24 +0200 Subject: [PATCH 99/99] New translations ai.md (Portuguese, Brazilian) --- .../current/settings/ai.md | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/settings/ai.md diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/settings/ai.md b/i18n/pt/docusaurus-plugin-content-docs/current/settings/ai.md new file mode 100644 index 00000000000000..31dd6276335c81 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/settings/ai.md @@ -0,0 +1,140 @@ +--- +id: ai +title: AI page +--- + +The AI page allows you to add, remove, or view the list of all your AI providers and their related model aliases, whether they come from local sources or internet-based services. Providers and model aliases can then be used in your code througout your 4D application, especially with the [**4D-AIKit component**](../aikit/overview.md) using the [**model aliases**](../aikit/provider-model-aliases.md) feature. + +:::tip Related blog post + +[Centralizing AI Providers and Model Aliases in 4D](https://blog.4d.com/centralizing-ai-providers-and-model-aliases-in-4d) + +::: + +## Managing providers + +4D supports [various AI providers](../aikit/compatible-openai.md) with an OpenAI-like API, each offering unique models and features for database needs. + +By default, the Providers list is empty. + +### Adding a provider + +To add an AI provider: + +1. Click on the **+** button at the bottom of the Providers list. +2. Enter the required [provider's configuration fields](#provider-properties), including credentials. +3. (optional) Click the **Test connection** button to make sure the provided URL and credentials are valid. + +If the connection is successful, the number of available models is displayed on the right side of the button: + +![](../assets/en/settings/ai-connection-ok.png) + +If the connection test fails, an error message is displayed (e.g. "Request failed: Not found" or "Request failed: Unauthorized"). + +4. Click **OK** to save the new provider, or **Cancel** to revert all modifications. + +### Editing a provider + +To edit or remove a provider: + +1. Select a registered provider in the list. +2. Edit the provider's information OR to remove a provider, click on the **-** button at the bottom of the Providers list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +## Provider properties + +When you select a provider in the Providers list, several properties are available. Property names in **bold** are mandatory to create a Provider. + +### Nome + +Local name used to identify the provider in your code, for example "claude". The name must be [compliant with property names](../Concepts/identifiers.md) since it will be used in the application's code to reference the provider. + +### Base URL + +Endpoint of the provider's API, for example `https://api.openai.com/v1` or `http://localhost:11434/v1`. + +The combo box lists the main providers, you can select a value to enter the provider endpoint: + +![](../assets/en/settings/ai-base-url.png) + +### API Key + +(optional) API key for the provider. For instructions on generating an API key, please refer to your AI provider’s official documentation. Some AI providers may also require additional specific credentials. + +### Organization + +(optional, OpenAI-specific) Organization ID used by the OpenAI API. + +### Project + +(optional, OpenAI-specific) ID of the project. Each OpenAI API key is attached to a project. + +### AIProviders.json + +The provider configuration is stored in a JSON file named *AIProviders.json* located next to the active *settings.4DSettings file* within the [project folder](../Project/architecture.md), [depending on your deployment configuration](./overview.md#enabling-user-settings). + +### Deployment with an API key + +When configuring an AI provider, you need to provide your own API key. It requires an external registration for getting API keys/credentials from AI providers. + +Using the Settings dialog box, the 4D developer can define a custom **provider name** (for example "open-ai-v1") and use this custom name in the code. They can also test it using their API key. + +When the 4D application is deployed with the [User settings enabled](../settings/overview.md#enabling-user-settings), the administrator can configure the User settings by using the **same AI provider name** ("open-ai-v1") and **customize the API key** to use the customer's key. Thanks to the [User settings priority rules](../settings/overview.md#priority-of-settings), the customer settings will automatically override the developer settings. + +:::warning + +When using 4D in client/server mode, it is **strongly recommended** to execute AI-related code on the server side to protect API keys and credentials from exposure to remote machines. + +::: + +## Model Aliases + +The Model Aliases page allows you to list models from registered Providers that you want to use in your code and to name them with *aliases*. Thanks to model aliases, you avoid hardcoding model names, switch models without changing your code, and keep consistency across environments. + +When using a model alias: + +- The provider is automatically resolved (see [Model resolution](../aikit/Classes/OpenAIProviders.md#model-resolution) in the 4D-AIKit documentation). +- The model ID is applied. +- All credentials and endpoints are used. + +### Adding a model alias + +:::note + +To be able to add a model alias, you must have entered at least one valid provider in the **Providers** tab. + +::: + +To add a model alias: + +1. Click on the **+** button at the bottom of the model aliases list. +2. In the **Name** column, enter the name of the alias. +3. Click on the corresponding row in the **Provider** column to display the list of available providers ([provider names](#name) you entered in the Providers page), and select the name of the provider. +4. Click on the corresponding row in the **Model** column to display the list of available models exposed by the selected provider and select the model. +5. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +![](../assets/en/settings/model-alias.png) + +### Editing a model alias + +To edit or remove an alias: + +1. Select a model alias in the list. +2. Edit the alias information OR to remove a alias, click on the **-** button at the bottom of the list. +3. Click **OK** to save the modifications, or **Cancel** to revert all modifications. + +### Using a model alias + +You can directly use the model alias name wherever a model name is required (provided that model aliases are supported). + +For example, in 4D-AIKit, you can reference a model with the syntax: *{model:"ModelName"}*, where *ModelName* is a valid model defined in the Model Aliases tab: + +```4d +var $client:=cs.AIKit.OpenAI.new() +var $result := $client.chat.completions.create($messages; \ + {model: "Chat Model"}) +``` + +### Veja também + +["Provider & Model Aliases"](../aikit/provider-model-aliases.md) in the 4D AIKit documentation. \ No newline at end of file